大家都知道麻省理工MIT是世界数一数二的大学,更是计算机技术科学界的翘楚。去年麻省理工又投资十亿美刀建立苏世民(Stephen A. Schwarzman)计算机学院。在最近院庆活动中,麻省了推出了其CS科技成果展,罗列了一些了伟大的发明包括了数字电路到可可消化胶囊肠壁治疗机器人。本文虫虫和大家一起来看看麻省这些改变世界的伟大发明。
1937年克劳德·香农(Claude Elwood Shannon)在麻省发表硕士论文《A Symbolic Analysis of Relay and Switching Circuits》(继电器与开关电路的符号分析):真/假逻辑的原理可以用来代表电气开关的开关状态。该论文开创了数字电路领域的基础,是整个数字行业,计算机的基础。基于该开创新的发现及后续一系列的理论,克劳德·香农被称为信息论之父。
世界上第一台可以实时运行的数字计算机来自旋风计划(Project Whirlwind)。这是二战期间的一项军方研究,1944年由麻省理工学院与美国海军合作开发完成旋风机器人,用于通用飞行模拟。该计划成功导致了世界上第一胎可实时运行的数字计算机旋风计算机,也为后续1951年麻省理工学院林肯实验室的成立奠定了基础。
Vannevar Bush教授1945年发表论文《As We May Think》提出了一个名为“Memex”的“扩展存储器(Memory-Extender)” 数据系统。该系统设想可以用来“存储用户所有的书籍,记录和通信信息”并能随意检索它们。这个概念启发了早期的超文本系统,正是由于系统的产生和繁荣,启发了几十年后万维网的诞生。
第一种函数式编程语言LISP是由John McCarthy教授于1958年在麻省理工发明的。在LISP之前,基于功能事的编程很难同时处理多个进程。函数式编程可让您更简单地描述所需的行为,从而可以处理比以往更大的问题。LISP诞生带动了大量的语言产生比如Clojure, Scala, Erlang, Haskell和 Elixir等,甚至在当今的编程语言中,增加函数式功能也还是个热点。
1959年麻省理工学院的学生Sam Asano发明了一种通过电话线传输扫描材料的技术,可以让你的听到声音的同时也能看到画面。但是该发明并未引起重视,日本电信公司NTT收购,NTT认为可以用来代替发电报,因为写下了传输图形,敲打字符要来的快。
麻省理工电气工程系气采购了PDP-1计算机首先被用来不是计算,而是被一群贪玩的学生用来打游戏了。1962年Marvin Minsky AI团队的学生Steven “Slug” Russell和游友们一起开发了一款空战视频游戏“SpaceWar!”,并在码农中广为流行,这是世界上第一款多人制游戏。
我们每天都要和密码打交道,密码是保障我们安全的最重要的屏障。而密码的发明也是来自于麻省理工。世界上第一个使用密码的系统是麻省理工学院的分时系统CTSS,弗尔南多考巴托(Fernando Jose Corbato) 教授于1963年在开发CTSS时候发明了密码,当时系统为了实现一个多终端,多用户,又互相隔离,每个用户自有文件目录,通过密码来区别用户成了简便快捷的解决方案。需要提及的是CTSS系统和后续的Multics,为Ken Thompson和Dennis Ritchie开发UNIX操作系统奠定了基础。考巴托教授因为这些突出的贡献于1990年被授予了计算机图灵奖 。
麻省理工的Ivan Sutherland博士生已经有了直接与电脑屏幕连接的想法,在前面提到的Memex系统的启发下,他于1963年开发“Sketchpad”系统,允许用户使用触摸笔绘制几何形状,开创了“计算机辅助绘图”的先河!
1969年玛格丽特.汉密尔顿(Margaret Hamilton)率领麻省理工学院的团队编写了阿波罗11号导航系统,该系统辅助宇航员Neil Armstrong和 Buzz Aldrin成功登月。系统功能强大,还覆盖了将飞行器计算机执行指令,比如从优先系统到雷达系统的切换等,更值得称道的的该系统在载人登月的阿波罗登月计划任务中始终未出现任何bug。汉密尔顿作为码农中的巾帼好英雄在2016年被奥巴马总统亲自颁发了自由总统自由勋章。
1971年麻省理工校友Ray Tomlinson发送了第一封通过计算机网络传递的电子邮件。他在BBN Technologies工作时,创造了Email,也是第一个使用@的人。
麻省理工教授Butler Lampson教授创立了施乐公司施乐帕克(Xerox Palo Alto)研究中心研究中心(PARC)。由于突出性研究工作,使Lampson教授赢得了“现代PC之父”的称号。1973年PARC创造世界上第一台个人电脑奥拓(Alto)。在奥拓电脑上有了世界上第一个图形用户界面(GUI),第一个位图显示,以及第一个“所见即所得”(WYSIWYG)编辑器。
1977年麻省理工团队在发明电子商务时候,发明了数据加密的RSA算法,RSA算法是一种非对称加密算法,它基于大质数的因数分解的困难度,来保证RSA的可靠性。
该算法在虫虫之前的文章中曾今介绍过,大家可以关注虫虫,从历史文章中查看详情介绍。
RSA算发的名字也是来自于麻省理工的三个发明人罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)的名字,取他们名字的第一个字母就是RSA。
1979年,Bob Frankston和Dan Brickson在麻省理工的大型机上工作夜以继日的工作,并创造了世界上第一个电子表格系统VisiCalc。VisiCalc一出世就受到广泛好评,第一年就卖出了超10万份的拷贝。有意思的是,VisiCalc还是推动苹果AppleⅡ电脑的大卖,因为当时VisiCalc和AppleⅡ是捆绑销售的。
通过以太网技术可让我们通过简单的电缆插件就可以联网。以太网技术的发明源于麻省理工校友鲍勃.梅特卡夫Bob Metcalfe。他曾在1973年了一篇有关以太网潜力的备忘录,1979他和助手一起发表了论文《以太网:局域计算机网络的分布式包交换技术》为以太网的诞生奠定了理论基础。1980梅特卡夫创建了3com公司,3com公司联合DEC、英特尔和施乐一起起早指定了太网标准化规范标志着以太网的正式诞生。由于以太网的发展和促进,才有了后来互联网的飞速发展和流行。
麻省理工本科生史蒂夫.基尔希(Steve Kirsch)于1980年第一个申请了光学计算机鼠标专利。他设想使用最少的精密移动部件制作一个“点设备”,为此,他创立了鼠标系统公司。他还发明了跟踪方法专利,通过点击计数来计算在线广告展示次数。
黑客文化和自由软件运动的主要先驱麻省AI实验室的Richard Stallman教父于1983年发起了GNU(GNU代表“GNU’s Not Unix”)计划,项目旨在开发Unix操作系统的免费替代品,GUN项目开发GCC、GDB、Gxxx等以G开头的自由软件。也为GNU/Linux操作系统和其他重要的计算创新奠定了基础。
Radia Perlman 是码农界的又一女豪杰,具有 “互联网之母”之称。她于1985年开发了生成树算法是全球计算机网络数据传输路由的基础。该算法将以太网从原始有限可扩展的单线CSMA/CD转换为可处理大型网络的协议,并使以太网可极大地利用带宽。路由生成树算法对互联网数据传输产生了深远影响,提高了整改互联网的鲁棒性,从此,互联网具具有了自我管理和可扩展的特性。
值得提及的是她还创建了LOGO,这是第一种面向儿童的编程语言。
WWW之父Tim Berners-Lee在发明Web之后,于1994年加入麻省理工并成立了一个致力于建立全球标准的互联网联盟,为建站、浏览器和设备提供服务,这就是W3C的来历。W3C标准用于构建可访问,安全,并可以轻松被搜索引擎优化(SEO)的网站标准。
1999年麻省理工教授Barbara Liskov的发表了关于实用拜占庭容错算法(PBFT: Practical Byzantine Fault Tolerance)论文奠定了区块链的理论基础,并生成了第一个区块链,这是一种广泛使用的密码系统。利斯科夫教授团队的区块链系统可以处理高吞吐量的事务,还首创了很多当今区块链平台至关重要的概念。
Colin Angle在读本科的时候加入了AI 实验室,在实验室时他萌生了让机器人能够和真实的环境进行实时反馈的想法,他开发了一款可移动机器人GenghiS。Genghis仿生了蚂蚁的灵感,他的导师是著名的机器人之父 Rodney Brooks教授。1990年, Colin Angle和导师 Rodney 教授同学 Helen Greiner 一起创办了机器人公司 iRobot。iRobot创建很多NB的机器人,比如火星车火星(漫游者Sojourner Rover),但是他的商业模式都不是很成功,直到2002年Roomba的推出,对,就是它,没有腿的机器人。截止目前Roomba扫地人已售出超2000万台,并催生了整个自动化清洁产品行业。
大家都知道苹果的Siri和亚马逊的Alexa。但是,很早之前就有了这样的系统。2007年麻省理工的教授Boris Katz就开发了StartMobile,一款可进行约会安排,信获取息以及使用语音完成各类任务的APP。
由前CSAIL主管Anant Agarwal领导,2012年麻省理工联合哈佛大学开办了大规模在线开放课堂平台EdX,通过该EdX提供免费的在线课程。截止目前EdX免费在线课程已经吸引了全球逾1800万学习者。
麻省计算机科学与人工智能实验室(CSAIL)Daniela Rus于2016年等开发了可消化折叠胶囊机器人,可将其吞咽到肠胃,预热可从胶囊状自动展开,可以在体外磁场控制它攀爬你的胃壁,修复伤口,去除结石和误吞咽下去的异物等。
Marc Raibert教授于1992年创建了波士顿动力公司。该公司制造了让人们大饱眼福的“大狗”,“Atlas”, “SpotMini”等机器人明星,可以攀爬,跑步,跳跃,甚至可以进行翻转。其中Atlas被用于DARPA机器人挑战赛,取得很棒的成绩。2013年波士顿动力公司被谷歌收购,2017年波士顿动力再次易主被日本软银收归旗下。
Perl6的开发如何做到自动化?其实很简单,只需要一个应用Tomtit。
Tomtit是一个全新的Perl6任务运行器,可让你很便捷地自动执行日常任务。
本文中,我们将展示如何使用Tomtit实现Perl6开发自动化,我们以实例展示Perl6开发中的典型场景:设置git存储库、测试本地源代码、安装本地源代码、发布CPAN模块。关于Tomtit的详细介绍请参考文章(https://dev.to/melezhik/one-tomtit-for-it–1j3f)。
本文译自Alexey Melezhik 的博客,原文链接 https://dev.to/melezhik/automation-of-perl6-development-workflow-through-the-tomtit-task-runner-10jj
Tomit的安装很简单只需通过Perl6 模块生态系统命令zef:
zef install Tomtit
现在让我们从远程git存储库获得本实例应用程序源代码:
git clone $ git-repo
本文的内容限制为在Perl6开发和发布时典型的应用场景:设置git存储库、测试本地源代码、安装本地源代码、发布CPAN模块。
首先我们为每个涉及的实例定义tomtit场景。场景配置文件位于.tom目录中,配置文件为纯Perl6脚本,同这些脚本调用Tomtit API。
在新建应用时候,先要设置用户和电子邮件,这样可以支持push到远程git仓。我们也希望在缓存中保存git密码。防止每次手动输入,这些任务都可以在.tom文件中配置:
.tom/set-get.pl6:
task-run “set git”, “git-base”, %(
email => ‘[email protected]’,
name => ‘chongchong’,
config_scope => ‘local’,
set_credential_cache => ‘on’
);
实例中的工作流程有点复杂,需要将源代码推送到GitHub和BitBucket两个远程库。
为push操作的任务场景配置也很容易:
.tom/push-gh.pl6:
# push到 github
bash “git push origin master”;
.tom/push-bb.pl6:
# push 到bitbucket
bash “git push bb master”;
.tom/push.pl6:
# push到github和bitbucket
EVALFILE “.tom/push-bb.pl6”
EVALFILE “.tom/push-gh.pl6”
对于许多Perl6项目,会通过zef test
测试
在t/目录中的单元测试用例,本例子中我们还要做Outthentic测试并且验证META6.json文件,看看是否有任何JSON语法错误,任务的配置实例如下:
.tom/test.pl6:
task-run “check json files”, “json-lint”, %( path => “{$*CWD}” );
bash “zef test .”;
bash “sh run-test.sh”;
该操作简单,只是在当前工作目录的下执行zef install命令。
.tom/install.pl6:
bash “zef install . –force-install”;
实例中我们使用App::Mi6工具将Perl6模块打包并发布到CPAN,执行该操作首先要在它需要通过~/.pause配置CPAN Update的用户和密码,下面是该任务的配置文件:
.tom/set-pause.pl6:
my $password = prompt(“enter your CPAN password: “);
template-create “/home/{%*ENV<USER>}/.pause”, %(
mode => ‘700’,
variables => %(
user => ‘chongchong’,
password => $password
),
source => q:to /TEMPL/
user [%= user %]
password [%= password %]
TEMPL
);
发布的任务配置就简单了:
.tom/release.pl6:
zef “App::Mi6”;
bash “mi6 release”;
当tomtit场景准备就绪时,开发工作流就变的简单明了,当一切都配置到位的时候:
1、chekout应用程序源代码:
git clone $git-repo
2、安装Tomtit:
zef intall Tomtit
3、列出可用的tomtits任务:
tom –list
4、修改源代码
vim foo/bar/app.pl6
5、运行测试:
tom test
安装应用:
tom install
6、设置git repo:
tom git-setup
7、提交更改
git commit -a
8、推送更改:
tom push
9、设置PAUSE帐户凭据:
tom set-pause
10、发布到CPAN:
tom release
本文中,我们实现了Perl6开发的自动化任务执行过程,所有操作只需要Tomtit就可以实现。更多典型任务请关注官方文档和探索。
]]>Tomtit是基于Perl6语言开发的任务执行器,它方便好用、任务定义快捷简洁,内置数十个常用场景任务插件,利用该雀儿帮我们自动化Perl/Perl6以及更多的语言开发任务。
最适合Perl5/Perl6开发人员,也支持其他开发场景使用;
支持Perl6语言的编程API;
自带许多常见任务任务配置:运行Bash脚本、创建文件和启动/停止服务 ,更多的任务脚本详见:
https://github.com/melezhik/sparrowdo/blob/master/core-dsl.md
它有几十个插件,详细列表请访问http://sparrowhub.org
支持扩展, 你可以使用自己喜欢的语言并编写新的插件来满足的特定需求。
最重要的是作为底线,它可以帮助我们轻松完成常见的任务,但不限于静态DSL,而是允许你使用现代化的强大的Perl6语言来配置任务场景。说这么多,你一定心动了把,那让咱们开始把。
Tomtit是一个标准的Perl6模块,可以使用Perl6模块生态系统包管理软件zef安装。
zef install Tomtit
成功安装后,Tomcatit在你的shell环境增加tom -命令行客户端来执行具体的任务。
你需要一个系统引启动器(*)来引导Tomtit的内部任务器的运行,实际上就是一个简单的命令
tom –bootstrap
注意:你需要sudo权限来启动该任务器。
完成启动后,你就可以执行任务脚本,接着让我们来看看典型的tomtit工作流程。
通常使用tomtit的工作流程是先定义方案(任务脚本),然后运行它们时。它基于任务为中心的方法非常便捷,我们可以检查应用程序的源代码并运行一些相关的任务。比如,我们有一个应用程序源代码,我们只需执行3个标准操作:
build,测试和安装
我们定以后任务方案后,我们命名他们然后构建,测试和安装。如果使用make程序来构建项目,则方案对应make对应参数的3次调用。让我们创建我们的第一个Tomtit场景:
git checkout $git-repo
mkdir .tom
nano .tom/build.pl6
nano .tom/test.pl6
nano .tom/install.pl6
每个场景的代码和bash命令运行make一样简单:
.tom/build.pl6:
bash “make”
.tom/test.pl6:
bash “make test”
.tom/install.pl6:
bash “sudo make install”
tomtit的任务方案场景的脚本是用Perl6编写的,对应于调用不同的任务,但这些场景不一定是有限的任务调用,它们只是Perl6程序,基于Perl6的强大功能你可以使用它做任何事情。
Tomtit中有两种语法不同的任务。你通过任务运行函数调用的第一个是快捷方式,它与task-run几乎相同但具有助记符名称,有时更容易签名。
在上述make实用程序的场景中,我们使用bash快捷方式调用一段Bash代码。tomtie可调用的完整快捷方式列表,请浏览:
https://github.com/melezhik/sparrowdo/blob/master/core-dsl.md
换句话说,任务运行和快捷方式只是一种调用任务块的方法,如果代码从SparrowHub下载,脚本存储库然后由sparrow内部脚本运行执行,虽然不之前没有提到过,但实际上zoo-repository支持更多的birds!
这些小脚本或任务也叫Sparrow插件。Tomtits的任务场景基对应于一个执行的Sparrow插件或任务的列表。
通过运行tom –list,你可以到当前可用的所有任务场景:
[scenarios list]
build
test
install
一旦定义了任务方案,就可以通过tom –run=$scenario命令运行它们。例如:
tom run = build,tom run = test等等。
要回想一下你运行的最后一个场景是什么,可使用tom –last命令。更多文档,请参考tomtitgithub页面的tom命令行的相关说明。
就上上文中我们提到的,我们不必受限于Tomtit场景中运行Bash和官方一些标准的任务场景。我们可以下载和自己开发相关插件,可以实现各种形形色色的任务。
例如,我们创建一个用用户参数(如用户名和电子邮件)配置本地git存储库的方案。你要clone一个新项目时,通常需要对其做修改并提交修改,最后push到远程库。那么本任务就是帮助你实现这个任务,并能自动缓存用户账号信息,以后不需要再输入用户名和密码(http/https)。
.tom/git-setup.pl6:
task-run “set git”, “git-base”, %(
email => ‘[email protected]’,
name => ‘chongchong’,
config_scope => ‘local’,
set_credential_cache => ‘on’
);
通过设置config_scope,我们定义任务为对本地git存储库进行设置,并通过设置set_credential_cache为“on”,我们要求git缓存密码。
可以在SparrowHub的sparrow插件存储库中找到可在Tomtit方案中使用的插件列表。
在下面的场景示例中,我们创建任务以通过vsts-build插件远程运行VSTS构建:
.tom/build-vsts.pl6:
task_run “run my build”, “vsts-build”, %(
definition => “BackEndBuild”
)
你可以在Tomtit方案中使用许多其他插件作为任务。 关于更多的插件,请查看SparrowHub存储库SparrowHub。
Tomtit为我们提供了大量可用于日常任务的小脚本或插件,尤其是在处理开发类的源代码管理和自动化构建的任务。Tomtit任务场景配置脚本使用的是普通Perl6脚本,用于生成执行任务的动态列表。任务脚本支持语法糖,你可以使用预定义的内置函数集,而不是引用插件,使代码更简洁,更容易阅读。
如果由于某些原因你找不到解决你特定任务的插件,你可以随时创建自己的插件。
]]>最近又有人挖坑zabbix的sql注入漏洞,此漏洞不在详细说了。此漏洞的利用有个条件必须要登录才行。zabbix如果不做安全配置的话,默认是guest用户空密码可以登录的。
为此写一个脚本检测是否禁用了guest用户,用来批量检查,加固。
use strict; use warnings; use LWP; use Encode; use Data::Dumper; my $lwp = LWP::UserAgent->new; my @url=qw( http://192.168.1/zabbix http://zabbix.ooxx.com http://sb.zabbix.rc/zabbix #... 添加和修改更多的地址 ); for (@url) { my $login_url = $_."/dashboard.php"; print $login_url,":n"; my $respos= $lwp->get($login_url); if ($respos->is_success) { my $res=$respos->content; print "please disable guest accesss!","n" if $res=~/menu_graphs/ms; print "good","n" if $res=~/(<!-- Login Form -->)|(You are not logged in)/ms; } else { print "Login Error: ",$respos->status_line,"n"; } }
上面是是多个地址批量检验的,同时没有兼顾新版本的zabbix,新版可能会报 404错误,下面在发一个检测单url的,同时兼顾新版本zabbix的
use strict; use warnings; use LWP; use Encode; use Data::Dumper; my $url=shift @ARGV; my $lwp = LWP::UserAgent->new; my $login_url1 = $url."/zabbix.php?action=dashboard.view"; my $login_url = $url."/dashboard.php"; my $ok=check($login_url); $ok=check($login_url1) unless $ok; print "Login Error: ","n" unless $ok; sub check { my $url=shift; print $url,":n"; my $respos= $lwp->get($url); if ($respos->is_success) { my $res=$respos->content; print "please disable guest accesss!","n" if $res=~/menu_graphs|initPMaster/ms; print "good","n" if $res=~/(<!-- Login Form -->)|(You are not logged in)/ms; return 1; } else {return 0}; }
使用方法:以上脚本保存为ztest1.pl
然后执行 perl ztest1.pl http://zabbix.org/zabbix
]]>
1、获得详细的系统信息
use Rex -feature => ['1.0']; task "sysinfo", group =>"all", sub { say connection->server."::"; dump_system_information; say "=========================="; };
rex -qw sysinfo 就能打印相关信息。
2、通过get_system_information获得特需的信息
task "get_hostname",group =>"all" sub { my %info = get_system_information; say Dumper $info{Host}; };
3、在模板中插入环境信息
可以在模板中插入这些环境信息,比如可以把ip地址或者hostname插入到一个模板文件中:
Listen <%= $eth0_ip %>:80
做为配置文件,用以适应不同的环境情况。
]]>登录系统发现find被替换为空文件了……
1、批量扫描有多少服务器有问题:很简单扫描远程服务目录find 如果大小为1(即使为空)。
task “find”, group => “all”, sub {
my $output= run ‘ls -al /bin/find’;
say connection->server.’:’. $output;
};
rex -qw find 1>findlist.txt
然后对findlist处理,当然是perloneline
perl -lane ‘print $F[0] if $F[5]==1’ findlist.txt|perl -pe ‘s/:$//’
获得有问题的服务器列表。
2、打印对服务器版本进行,以便找到相对应的find文件进行替换
task “issue”, group => “all”, sub {
my $output= run ‘cat /etc/issue’;
say connection->server.’:’. $output;
};
3、替换find文件,用upload上传,并改变其属主和分组,最后试着使用find命令搜索/root目录的文件,如果有输出即为替换成功。
task “findchange”, group => “all”, sub {
upload “/tmp/find”, “/bin/find”;
run ‘chown root.root /bin/find ‘;
my $output=run ‘find /root -type f|wc -l ‘;
say connection->server.’:’. $output;
};
]]>Augeas基本上就是一个配置编辑工具。它以他们原生的格式解析配置文件并且将它们转换成树。配置的更改可以通过操作树来完成,并可以以原生配置文件格式保存配置。
2、查找一个配置节点
use Rex::Commands::Augeas; my $k = augeas exists => "/files/etc/hosts/*/ipaddr", "127.0.0.1";
3、增加一个配置项目
augeas insert => "/files/etc/hosts", label => "01", after => "/7", ipaddr => "192.168.2.23", canonical => "test";
结果:
192.168.1.1 tcentral localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.1 tv_central 192.168.1.1 centralmysq 192.168.1.1 centralmemecache 192.168.1.1 memecache01 192.168.1.1 redis 192.168.2.23 test
3、导出配置文件
augeas dump => "/files/etc/hosts";
结果
/files/etc/hosts /files/etc/hosts/1 /files/etc/hosts/1/ipaddr = " 192.168.1.1" /files/etc/hosts/1/canonical = "tv_central_platform01" /files/etc/hosts/1/alias[1] = "localhost" /files/etc/hosts/1/alias[2] = "localhost.localdomain" /files/etc/hosts/1/alias[3] = "localhost4" /files/etc/hosts/1/alias[4] = "localhost4.localdomain4" /files/etc/hosts/2 /files/etc/hosts/2/ipaddr = "::1" /files/etc/hosts/2/canonical = "localhost" /files/etc/hosts/2/alias[1] = "localhost.localdomain" /files/etc/hosts/2/alias[2] = "localhost6" /files/etc/hosts/2/alias[3] = "localhost6.localdomain6" /files/etc/hosts/3
4、修改文件
augeas modify => "/files/etc/ssh/sshd_config/PermitRootLogin" => "without-password", on_change => sub { service ssh => "restart"; };]]>
#!/usr/bin/env perl my $LIMIT=30; my $log="/var/log/secure"; my $LOGFILE="/data/block_ip.log"; my $TIME=`date '+%b %e %H'`; chomp $TIME; my $BLOCK_IP; my %hash; open(FD,$log)||die("Can not open the file!$!n"); while(<FD>){ chomp; if ( /$TIME/ and /Failed password/ ) { my @line=split; my $ip=$line[-4]; $hash{$ip}++; } } close(FD); for(%hash) { if ($hash{$_} > $LIMIT) { my $IP=$_; $ips= `iptables-save`; $mo= qr(/INPUT/ and /DROP/ and /$IP/); unless ($ips=~$mo) { `iptables -I INPUT -s $IP -j DROP`; my $NOW=`date '+%Y-%m-%d %H:%M'`; chomp $NOW; `echo -e "$NOW : $IP" >>$LOGFILE`; } } }
2、将该脚本保存为block_ssh.sh
3、创建一个上传任务,把该文件上传到远程服务器,给予执行权限。加入crontab 每5分钟执行一次。
task "upload", group =>"all", sub { say connection->server.":begin upload files!"; upload "block_ssh.sh", "/root/block_ssh.sh"; run "chmod 755 /root/block_ssh.sh"; run 'echo "*/5 * * * * root /root/block_ssh.sh" >>/etc/crontab'; say connection->server.":upload success!"; };
]]>
task "task", group => "all",sub { ... say connection->server; };
rex -qw task 1>info.txt 2>error.txt
这样根据inofo.txt输出信息就能判断执行成功的,服务器。而执行失败的情况则可以通过
error.txt来获得,比如远程连接有问题的和连接账号有问题的信息(0.55版本,最新版本错误提示
有问题,无法区别出来了)。这两类典型的信息输出为:
ESC[0mESC[33m[2015-12-01 11:26:05] WARN - Error running task/batch: Wrong username/password or wrong key on 192.168.1.2. at /usr/local/share/perl5/Rex/TaskList/Base.pm line 245. ESC[0mESC[33m[2015-12-01 11:26:07] WARN - Can't connect to 10.16.194.18 ESC[0mESC[33m[2015-12-01 11:26:07] WARN - Error running task/batch: Couldn't connect to 10.16.194.18. at /usr/local/share/perl5/Rex/TaskList/Base.pm line 245.
用两个单行命令就能到相关信息,首先是无法连接的服务器(可能网络有问题、防火墙限制或者端口设置错误了)。
perl -lane '/Can/ and print $F[-1]' error.txt
然后是用户名密码错误的服务器
perl -lane '/Wrong/ and $F[-5]=~s/.$// and print $F[-5]' error.txt
]]>
task "my_user", sub { my $local_keys = LOCAL{ my @key_files = qw( /root/.ssh/id_rsa.pub /home/user/.ssh/id_rsa.pub ); my @tmp; push ( @tmp, split "n", cat $_ ) foreach @key_files; return @tmp; }; my @remote_keys = split "n", cat '~/.ssh/authorized_keys'; create_user "myuser", home => '/home/myuser', comment => 'My user', expire => '2100-05-30', password => 'password', system => 1, create_home => TRUE, ssh_key => join "n", @$local_keys, @remote_keys; say connection->server; };
对于已经创建用户,并且远程证书文件已经存在的,追加时候直接追加用户证书
task "addkeys", group => "all", sub { my $local_keys = LOCAL{ my @key_files = qw( /root/.ssh/id_rsa.pub /home/user/.ssh/id_rsa.pub ); my @tmp; push ( @tmp, split "n", cat $_ ) foreach @key_files; return @tmp; }; my @remote_keys = split "n", cat '~/.ssh/authorized_keys'; run 'echo @$local_keys >>/home/ZX_lz/.ssh/authorized_keys'; say connection->server; }
]]>