我有一项任务,我想知道你是否可以提供帮助。对于部分问题,我需要分析系统日志。该日志包含时间和日期等信息,如果尝试进行root访问以及尝试来自哪个ip地址。
我的问题是:如何循环日志并拔出IP地址。
myFile = open('syslog','r')
for line in myFile.readlines():
list_of_line = line.split(' ')
所以我在这里拆分了列表但是如何循环尝试找到一个IP地址。以前我使用过位置,但这不实用,因为它只查找一个地址。我希望它能够搜索并查找所有地址,这样就意味着寻找具有一定长度的字符串,例如xxx.xxx.xx.xx作为IP地址并指定我正在寻找数值。
编辑 -
Jan 10 09:32:07 j4-be03 sshd[3876]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.241.173.35 user=root
Jan 10 09:32:09 j4-be03 sshd[3876]: Failed password for root from 218.241.173.35 port 47084 ssh2
Jan 10 09:32:17 j4-be03 sshd[3879]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.241.173.35 user=root
Jan 10 09:32:19 j4-be03 sshd[3879]: Failed password for root from 218.241.173.35 port 47901 ssh2
Jan 10 09:32:26 j4-be03 sshd[3881]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.241.173.35 user=root
Jan 10 09:32:29 j4-be03 sshd[3881]: Failed password for root from 218.241.173.35 port 48652 ssh2
我被告知要忽略包含pam_unix
的行,并将注意力集中在包含“root的密码失败”的行,因为它们是重复的条目。即将尝试正则表达式虽然我真的不明白发生了什么。
答案 0 :(得分:1)
if s in line
prefix = "Failed password for root from"
def extract_ip(line):
# get string between `prefix` and 'port'
return line.partition(prefix)[2].partition('port')[0].strip()
with open('syslog') as f:
ips = [extract_ip(line) for line in f if prefix in line]
一般来说,正则表达式可以标记输入。
答案 1 :(得分:0)
一个解决方案(虽然有点笨拙)是使用句点作为分隔符来分割list_of_line
中的每个字符串。一旦你完成了,你可以检查你生成的数组是4个项目,这表明它是一个IP,然后你可以从list_of_line
获取原始字符串并做你需要的任何事情用它。你想要一些伪代码吗?
注意:虽然这种方法简单易读,但确实存在一些缺点。首先,它可能有点慢,但如果这是一个任务,速度很可能不是真正的问题。其次,您可能在list_of_line
中有其他与IP格式相同的项目(我认为这不太可能),在这种情况下,您的IP列表中会得到非IP结果。只需要注意几点。
另一种解决方案是使用Python的Regex功能 - 你可以只使用Google获取更多信息,这有点复杂。
答案 2 :(得分:0)
import re
myFile = open('syslog','r')
ip = re.findall( r'[0-9]+(?:\.[0-9]+){3}', myFile.read() )
print ip
难道你不喜欢python吗?