分类目录归档:perl
发表评论
perl 实现打印匹配模式行及上下行的操作
这个可能用的着,在看日志时候,比如搜索tomcat 错误日志的时候
1、perl One-liner实现
1 |
perl -ne '/RE/ and {push @a,$.};push @b,$_;END{for(@a){print $b[$_-2];print $b[$_-1];print $b[$_]}}' file |
实现原理:把每一行保存在一个数组@b里,把匹配的行号保存在素组@a里,然后在END模块打印出来
2、perl脚本实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/usr/bin/env perl $re=shift; $file=shift; open $line,"<",$file or die; while(<$line>) { push @b,$_; $i++; chomp; /$re/ and push(@a,$i) ; } close $line; for(@a) { print $b[$_-2]; print $b[$_-1]; print $b[$_]; } |
保存为xx.pl 然后chmod u+x xx.pl
./xx.pl RE file
rex advent——rex获得远程服务器信息
如何获得远程服务器的相关信息呢?比如系统的发行版本,版本好,内核的版本号,主机名,网络信息。Rex专门提供了一个模块system_information来收集这些信息。
rex advent——rex批量替换被篡改的文件
rex advent——rex 利用Augeas模块进行文件配置
rex advent—— rex 批量部署sshd密码尝试攻击脚本
1、首先是防攻击脚本,原理是扫描/var/log/secure文件,发现一小时内尝试密码错误超过30次的ip,则
将该ip加入iptables黑名单drop掉。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#!/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分钟执行一次。
1 2 3 4 5 6 7 |
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!"; }; |
rex advent—— rex 任务执行情况,错误信息等
当批量远程执行任务时如何判断任务执行是否成功,以及错误信息呢?
最简单是方法是在设定执行完一个任务后输出服务器ip,然后根据输出信息来判断
1 2 3 4 5 6 |
task "task", group => "all",sub { ... say connection->server; }; |
rex advent—— rex 创建用户并追加本地多文件ssh公钥到远程服务器用户
管理用户密钥比较繁琐,尤其是多密钥时候,下面给出一种方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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; }; |
rex advent—— rex 加密Rexfile中账号和证书信息
我们知道Rexfile的账号密码和证书路径都是密码的,容易泄漏了,我们可以用base94算法对进行一下加密
可以防止直接被泄露,虽然这不能保证被人反解密(可以用自己加密算法写模块,或者更底层的方法,这里不深入),
但是聊胜于无。好吧先看具体做法。
基本原理用Base64基本算法,用两个函数encode_base64()和 decode_base64()。
rex advent—— 批量创建账号并添加sudo
创建多个用户,创建的用户和密码键值对用上文章《 rex 加密Rexfile中账号和证书信息》生成hash字符串
每个账号一个,然后就可以。
继续阅读