Python 分隔符问题
Python split delimiter issue
我几个月前构建了一个小的 python 脚本,它从我的蜜罐日志中收集一些非常基本的统计数据。我发现这个脚本有问题,我自己也找不到答案。
该脚本将从攻击中读取日志文件。
日志文件每行包含五条数据。
- date/time戳
- 发生攻击的 IP 地址
- 尝试的用户名
- 尝试输入密码
- success/failure代码
示例:
2014-12-24 13:37:00,1.2.3.4,root,password,0
五条数据之间用','隔开。
所以我使用','作为分隔符将行分成一个列表,就像这样。
['2014-12-24 13:37:00', '1.2.3.4', 'root', 'password', '0']
我可以从中获取我需要的数据。
这个问题,我相信你们中的一些人已经想通了,
当尝试的密码中存在定界符时发生,
在这种情况下 H4ck3r,h4cker,2015
日志文件最终看起来像这样
2015-01-02 01:44:38,2.3.4.5,root,H4ck3r,,h4cker,,2015,0
并在 slpit 之后将结果列表变成这个。
['2015-01-02 01:44:38', '2.3.4.5', 'root', 'H4ck3r', '', 'h4cker', '', '2015', '0']
我首先想到的解决方法是删除 [0:3] 和 [-1],
然后接受剩下的密码但是,
至少可以说不是很干净也不准确。
如果攻击者在用户名中使用定界符,我会回到原点。
问题。
- 有没有简单明了的方法使用拆分来解决这个问题?
- 正则表达式是最好的方式吗?
- ...其他解决方法?
正如 mgilson 已经指出的,您应该更改日志文件的格式(如果可能)。
要解析现有日志,您可以使用正则表达式^([^,]*),([^,]*),([^,]*),(.*),(\d+)\s*$
。这会捕获组 1 中的时间戳、组 2 中的 ip 等等。
>>> pattern= r'^([^,]*),([^,]*),([^,]*),(.*),(\d+)\s*$'
>>> string= 'time,ip,user,H4ck3r,,h4cker,,2015 ,1'
>>> match= re.match(pattern, string)
>>> print match.groups()
('time', 'ip', 'user', 'H4ck3r,,h4cker,,2015 ', '1')
我几个月前构建了一个小的 python 脚本,它从我的蜜罐日志中收集一些非常基本的统计数据。我发现这个脚本有问题,我自己也找不到答案。
该脚本将从攻击中读取日志文件。 日志文件每行包含五条数据。
- date/time戳
- 发生攻击的 IP 地址
- 尝试的用户名
- 尝试输入密码
- success/failure代码
示例:
2014-12-24 13:37:00,1.2.3.4,root,password,0
五条数据之间用','隔开。
所以我使用','作为分隔符将行分成一个列表,就像这样。
['2014-12-24 13:37:00', '1.2.3.4', 'root', 'password', '0']
我可以从中获取我需要的数据。
这个问题,我相信你们中的一些人已经想通了,
当尝试的密码中存在定界符时发生,
在这种情况下 H4ck3r,h4cker,2015
日志文件最终看起来像这样
2015-01-02 01:44:38,2.3.4.5,root,H4ck3r,,h4cker,,2015,0
并在 slpit 之后将结果列表变成这个。
['2015-01-02 01:44:38', '2.3.4.5', 'root', 'H4ck3r', '', 'h4cker', '', '2015', '0']
我首先想到的解决方法是删除 [0:3] 和 [-1],
然后接受剩下的密码但是,
至少可以说不是很干净也不准确。
如果攻击者在用户名中使用定界符,我会回到原点。
问题。
- 有没有简单明了的方法使用拆分来解决这个问题?
- 正则表达式是最好的方式吗?
- ...其他解决方法?
正如 mgilson 已经指出的,您应该更改日志文件的格式(如果可能)。
要解析现有日志,您可以使用正则表达式^([^,]*),([^,]*),([^,]*),(.*),(\d+)\s*$
。这会捕获组 1 中的时间戳、组 2 中的 ip 等等。
>>> pattern= r'^([^,]*),([^,]*),([^,]*),(.*),(\d+)\s*$'
>>> string= 'time,ip,user,H4ck3r,,h4cker,,2015 ,1'
>>> match= re.match(pattern, string)
>>> print match.groups()
('time', 'ip', 'user', 'H4ck3r,,h4cker,,2015 ', '1')