需求
1、监控日志文件,记录攻击次数较多的IP
分析
#1、打开日志文件;
#2、把IP地址拿出来;
#3、判断每个IP出现的次数,如果大于50次,加入黑名单
其它知识点
#文件名柄,文件对象都是指执行open后打开的对象
#f.readline()#一行一行的读,节省内存资源;
#f.read()#如果用read来读是一次性把文件的所有内容读进内存,如果文件特别大,内存资源又小的情况下,有可能把内存撑爆;
#直接循环1个文件对象,每次循环的是文件的每一行,循环什么时候循环结束了代表文件内容就读完了;for line in f:
#日志读取为1分钟读取一次,可以用time.sleep(60)方法;
#由于每次读取日志时都是从第一行开始读取,但实际操作中应该是接着从上次读取的位置开始读取;可以使用f.tell方法,获取当前指针位置;
#想取一个值大于等于几的次数:循环列表取值,列表中这个值出现的次数用all_ips.count(ip)>50;
import time
point=0 #每次记录指针的位置
while True:
all_ips = []
f = open('access.log', encoding='utf-8')
f.seek(point)
for line in f:
ip = line.split()[0]
all_ips.append(ip)
point=f.tell()
all_ip_set = set(all_ips)
for ip in all_ip_set:
if all_ips.count(ip) > 50:
print('加入黑名单的IP是%s'%ip)
time.sleep(60)#暂停60S
import time
ip_lis=[]
point=0
while True:
with open('access.log', encoding='utf-8') as f:
f.seek(point)
for line in f:
ip = line.split()[0]
ip_lis.append(ip)
point = f.tell()
ip_lis_set = set(ip_lis)
for i in ip_lis_set:
if ip_lis.count(i) >= 50:
print('加入黑名单的IP有:%s' % i)
time.sleep(60)