import re import subprocess with open('/var/log/suricata/fast.log', 'r') as f: for line in f: # 使用正则表达式匹配IP地址 match = re.search(r'{TCP} \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} 失败!')如何实现实时读取日志内容并封禁ip
时间: 2023-12-03 09:47:37 浏览: 141
subprocess.h::ant:适用于C和C ++的单头进程启动解决方案
如果想实现实时读取日志并封禁IP,可以使用类似tail命令的方式读取日志,然后对新读取到的每一行进行处理。可以使用Python的subprocess模块中的Popen函数来实现。
下面是一个示例代码,用于实时读取/var/log/suricata/fast.log日志文件,并封禁其中出现的IP地址:
```python
import re
import subprocess
# 打开日志文件
log_file = '/var/log/suricata/fast.log'
with subprocess.Popen(['tail', '-F', log_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc:
# 逐行读取日志并处理
for line in iter(proc.stdout.readline, b''):
# 使用正则表达式匹配IP地址
match = re.search(r'{TCP} \d+\.\d+\.\d+\.\d+', line.decode('utf-8'))
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} 失败!')
```
这个代码使用Popen函数打开一个tail -F命令,相当于实时读取文件,并将输出通过管道传递给Python程序。然后使用iter函数逐行读取输出,并对每一行进行处理。注意要将读取到的二进制数据解码成字符串格式。处理过程与之前的代码类似。
阅读全文