需求: 1. 每分钟监控服务器日志,每分钟请求超过200次,加入黑名单 编写思路 1. 读文件,获取每行的内容 open readlines xx.2x.x.x - - [04/Jun/2018:03:44:13 +0800] 2. 找到IP地址,按照空格分割字符串,取第一个元素 split 3. 把IP存到字典里面,每个IP出现一次,IP次数就加1 {'ip1':1,'ip2':2,'ip3':1} ['1xx.xx.xx.xx','xxx.xx0.xx.xx','xx.xx.xx.xx'] 4. 判断IP次数是否大于200,加入黑名单
import time # 引入time模块 point = 0 # 存放的是文件初始的位置,如果不写,会提示point未定义,因为代码是从上往下读取的,第一次并未读取到point,所以我们需要先定义point的初始值 while True: # 写一个死循环,因为文件是一直在读取中的,60秒重新读取一次 with open('abc.txt', encoding='utf-8') as f: # 打开日志文件 f.seek(point) # 再次打开文件时,获取文件指针的位置 ip_info = {} # 定义一个空字典,存放ip和他出现的次数 for line in f: # 循环日志文件每行内容 ip = line.split()[0] # 我们需要找到ip,文件内是以空格分割的,所以我们只需要默认split就可以,然后我们找到ip,下标为0的元素 # 到这一步的时候,我们就可以将文件内的ip全部找出,可以使用print(ip)来查看一下是否实现此功能。 if ip in ip_info: # 我们需要判断一下ip是否在字典中 ip_info[ip] += 1 # ip在字典中,我们就给它在原来的值里+1 else: ip_info[ip] = 1 # ip如果不在字典中,ip的次数就等于1 print(ip_info) point = f.tell() # 循环结束后,tell()表示获取当前指针的位置 for k in ip_info: # 循环ip_info每一行数据 if ip_info.get(k) >= 200: # 判断如果ip_info[k]的值大于等于100次 print('该ip正在攻击你!%s' % k) # 输出 time.sleep(60) # 停止60秒,等60秒之后再继续运行