import re import subprocess import time file = open('/var/log/suricata/fast.log') file.seek(0, 2) while True: for line in file: # 使用正则表达式匹配IP地址 match = re.search(r'\d+\.\d+\.\d+\.\d+', line) if not match: continue ip = match.group() # 调用iptables命令封禁IP result = subprocess.call(['iptables', '-A', 'INPUT', '-s', ip, '-j', 'DROP']) if result == 0: print(f'封禁IP {ip} 成功!') else: print(f'封禁IP {ip} 失败!') time.sleep(5) # 每隔5秒读取一次日志 这段代码有问题,帮我优化修改一下
时间: 2023-12-11 21:06:07 浏览: 78
Python生成电子漫画.epub/.mobi/.pdf(cmd调用kindlegen)
这段代码有几个问题:
1. 文件操作没有放在 while True 循环里面,导致只会读取一次文件。
2. 每次循环都会从文件头开始查找,没有使用指针记录上次读取的位置。
3. 对于已经封禁的 IP 地址,仍然会不断地重复尝试封禁。
下面是优化后的代码:
```python
import re
import subprocess
import time
log_file = '/var/log/suricata/fast.log'
ip_set = set()
while True:
with open(log_file) as file:
file.seek(0, 2) # 将文件指针移动到文件末尾
for line in file:
match = re.search(r'\d+\.\d+\.\d+\.\d+', line)
if not match:
continue
ip = match.group()
if ip in ip_set:
continue
result = subprocess.call(['iptables', '-A', 'INPUT', '-s', ip, '-j', 'DROP'])
if result == 0:
print(f'封禁IP {ip} 成功!')
ip_set.add(ip)
else:
print(f'封禁IP {ip} 失败!')
time.sleep(5)
```
优化后的代码使用 set 存储已经封禁过的 IP 地址,每次循环只处理新出现的 IP 地址,并且通过文件指针记录上次读取的位置,避免重复读取。
阅读全文