Chinaunix首页 | 论坛 | 博客
  • 博客访问: 298093
  • 博文数量: 32
  • 博客积分: 2179
  • 博客等级: 大尉
  • 技术积分: 443
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-21 10:30
文章分类

全部博文(32)

文章存档

2014年(1)

2013年(4)

2011年(4)

2009年(11)

2008年(5)

2007年(7)

我的朋友

分类: Python/Ruby

2014-04-18 18:54:47

    
  1. #!/bin/env python
  2. # coding=utf-8
  3. import os, sys, time

  4. def parser_log(filename, time_length, num):
  5.     '''
  6.     解析nginx访问日志,对指定时长内超过num次数的IP限制访问
  7.     '''
  8.     limit_length = 10240000 # 每次读取长度,防止内存占用过大
  9.     stime = time.time() - int(time_length) * 60
  10.     ips = {}
  11.     
  12.     f = open(filename)
  13.     f.seek(0, 2)
  14.     cur_pos = f.tell()
  15.     first_length = 0
  16.     n = 1
  17.     
  18.     while cur_pos > 0:
  19.         cur_pos -= limit_length
  20.         if cur_pos < 0:
  21.             limit_length -= abs(cur_pos)
  22.             n = 0
  23.             cur_pos = 0
  24.         f.seek(cur_pos)
  25.         rs = f.read(limit_length + first_length).rstrip().split("\n")
  26.         first_length = len(rs[0])
  27.         for i in rs[n:][::-1]:
  28.             log_time = time.mktime(time.strptime(i.split("[")[1].split()[0], "%d/%b/%Y:%H:%M:%S"))
  29.             client_ip = i.split()[0]
  30.             if log_time < stime:
  31.                 break
  32.             if not ips.has_key(client_ip):
  33.                 ips[client_ip] = 0
  34.             ips[client_ip] += 1
  35.         if log_time < stime:
  36.                 break
  37.     for k, v in sorted(ips.items(),key=lambda x:x[1],reverse=True):
  38.         if v < int(num):
  39.             break
  40.         cmd = "/sbin/iptables -A INPUT -s %s -j DROP" % k
  41.         os.system(cmd)
  42.             
  43. if __name__ == "__main__":
  44.     parser_log(sys.argv[1], sys.argv[2], sys.argv[3])

阅读(3508) | 评论(1) | 转发(0) |
0

上一篇:shell/python/powershell处理文本小记

下一篇:没有了

给主人留下些什么吧!~~

xgtiger2014-04-27 01:24:08

每次都有新发现