免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2293 | 回复: 15
打印 上一主题 下一主题

大家帮我看看这个脚本有没有什么地方可以优化的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-01 09:09 |只看该作者 |倒序浏览
RT.. 第一次写脚本,完全是东查西凑拼出来的. 请大家帮我看看有没有优化的方法或建议. 谢谢.




  1. #!/bin/bash
  2. # 防SSH密码暴力破解脚本
  3. # 通过分析secure日志文件使用iptables拒绝恶意登入IP
  4. # by Qlin 2007.01.31

  5. LOG_FILE='/var/log/secure';         #日志路路径
  6. SAVE_FILE='belialIP';               #保存iptables拒绝IP文件名
  7. SAVE_TEMP_FILE=$SAVE_FILE'.temp';   #临时保存拒绝IP文件名,比较用
  8. IP_REPEAT=6;                        #允许尝试登入次数

  9. #二次正则是考虑日志文件过大导致sort排序过慢的问题(这只是我个人猜想并不排除正则比排序更慢的情况... -_-!)
  10. ip=`sed -n -e '/.*Failed password.*/p' $LOG_FILE | sort | uniq -c | awk -v nnm=$IP_REPEAT '{if($1 > num) print $0;}' | sed -n -e 's/.*Failed password.*from[ ]\(.*\)[ ]port.*/\1/p'`;

  11. backIFS=$IFS;
  12. IFS="\n";

  13. if [ -e $SAVE_FILE ]
  14. then
  15.     echo $ip > $SAVE_TEMP_FILE;
  16.     differ=`comm -13 $SAVE_FILE $SAVE_TEMP_FILE`;
  17.     tmp=`cat $SAVE_FILE`;
  18.     echo -e $differ"\n"$tmp | uniq | sort > $SAVE_FILE;
  19. else
  20.     differ=$ip;
  21.     echo $ip > $SAVE_FILE;
  22. fi

  23. if [ ${differ} ]
  24. then
  25.     IFS=$backIFS;
  26.     ips=`echo $differ | tr "\n" ' ' | tr -s ' '`;

  27.     for dip in $ips;
  28.     do
  29.         iptables -A INPUT -s $dip -j DROP
  30.     done;
  31. fi


复制代码

论坛徽章:
0
2 [报告]
发表于 2007-02-01 09:32 |只看该作者
提个建议。
1、获取那些频繁尝试登陆的ip,sed -n -e '/.*Failed password.*/p 完全匹配整一行的模式,可能还没有 grep Failed password 效率好。

2、sort | uniq -c 确实效率不高,而且同一秒内的登陆失败次数,相当的有限,或者你可以在awk 里面计算相同ip在某一分钟、某一小时的失败次数

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
3 [报告]
发表于 2007-02-01 09:37 |只看该作者
看样子,你这个脚本是定时执行的。
那么每次都对这个文件过滤的话,我感觉效率不高。

不如使用tail -f /var/log/secure | 这样子的方式,来调用你的程序,效率更好。

论坛徽章:
0
4 [报告]
发表于 2007-02-01 09:43 |只看该作者
谢谢楼上二位兄弟的建议. 马上改进..

论坛徽章:
0
5 [报告]
发表于 2007-02-01 09:53 |只看该作者
直观一点儿,
  1. MAX_TRYS_PERMINUTE=1
  2. SAVE_FILE=log
  3. grep 'Authentication failure' /var/log/secure |awk '

  4. function banIP(pIP){
  5.        
  6.         print "iptables -A INPUT -s " pIP " -j DROP";
  7. }

  8. {
  9. # $10 为 ip,$3 为时间 hh:mm:ss 格式,根据实际情况修改
  10.         key = $10 "," substr($3, 1, 5);
  11.         fails[key]++;
  12. }
  13. END {
  14.         for (key in fails) if (fails[key] > maxTrys){
  15.                
  16.                 split(key, arr, ",");
  17.                 banIP(arr[1]);
  18.         }
  19. }
  20. ' maxTrys=$MAX_TRYS_PERMINUTE | tee $SAVE_FILE |sh
复制代码

论坛徽章:
0
6 [报告]
发表于 2007-02-01 10:24 |只看该作者
tail -f 的方式,需要将数据保存,保存到什么时候扔掉?
这样吧,判断如果存在文件 SAVE_FILE,则 tail -${ TAIL_LINES } ,否则全部获取。
没测试:

  1. MAX_TRYS_PERMINUTE=1
  2. SAVE_FILE=log
  3. TAIL_LINES=500
  4. [ -f $SAVE_FILE ] && CONTENT_CMD="tail -${ TAIL_LINES } /var/log/secure" || CONTENT_CMD="cat /var/log/secure"

  5. $( CONTENT_CMD ) |grep 'Authentication failure' |awk '

  6. function banIP(pIP){
  7.         
  8.         print "iptables -A INPUT -s " pIP " -j DROP";
  9. }

  10. {
  11. # $10 为 ip,$3 为时间 hh:mm:ss 格式,根据实际情况修改
  12.         key = $10 "," substr($3, 1, 5);
  13.         fails[key]++;
  14. }
  15. END {
  16.         for (key in fails) if (fails[key] > maxTrys){
  17.                
  18.                 split(key, arr, ",");
  19.                 banIP(arr[1]);
  20.         }
  21. }
  22. ' maxTrys=$MAX_TRYS_PERMINUTE |tee -a $SAVE_FILE |sh
复制代码

论坛徽章:
0
7 [报告]
发表于 2007-02-01 16:48 |只看该作者

修改脚本遇到的问题

1, 貌似不能在awk代码中调用bash里定义的方法,如下代码测试不行..



  1. #!/bin/bash
  2. XXX() {
  3.     .....
  4. }

  5. tail -f log | awk '{if($0 ~ /Failed password/) { XXX } fflush(); }';

复制代码


2,因为上一个行不通,所以考虑能不能显示指定的行数. 比如说第一次cat 显示文件所有的行数,然后脚本记录下最后一行的行数,第二次cat时从上一次最后一行开始显示,找了一下貌似也不能实现...

现在就卡在这里了.... :em16 不知大家有什么好的方法...

论坛徽章:
0
8 [报告]
发表于 2007-02-01 17:05 |只看该作者
帮我测试一下6F,Authentication failure 修改一下 ^_^

论坛徽章:
0
9 [报告]
发表于 2007-02-01 17:16 |只看该作者
6F 的代码要如何执行...?

论坛徽章:
0
10 [报告]
发表于 2007-02-01 17:24 |只看该作者
copy & paste ,最好先不拷贝最后的 |sh
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP