【问题标题】:Python split delimiter issuePython拆分分隔符问题
【发布时间】:2015-01-06 23:47:20
【问题描述】:

几个月前,我构建了一个小型 python 脚本,它从我的蜜罐日志中收集一些非常基本的统计数据。我发现这个脚本有问题,我自己没有找到答案。

脚本将从攻击中读取日志文件。 日志文件每行包含 5 条数据。

  • 日期/时间戳
  • 发生攻击的 IP 地址
  • 尝试的用户名
  • 尝试的密码
  • 成功/失败代码


示例:

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],
然后接受剩下的密码,但是,
至少可以说不是很干净也不准确。
如果攻击者在用户名中使用分隔符,我将回到原点。

问题。

  • 是否有任何干净且简单的方法可以使用拆分来解决此问题?
  • 正则表达式是最好的方法吗?
  • ...解决此问题的其他方法?

【问题讨论】:

  • 我认为“最干净”的解决方案是使用csv.Writer 写入日志文件,然后使用csv.Reader 读取它——Writer/Reader 组合应该处理引用/取消引用字段给你。
  • 这可能是个好主意。不幸的是,我不是为此编写日志功能的人,谢谢您的提示。

标签: python regex split delimiter logfiles


【解决方案1】:

正如 mgilson 已经指出的,您应该更改日志文件的格式(如果可能)。

要解析现有日志,您可以使用正则表达式^([^,]*),([^,]*),([^,]*),(.*),(\d+)\s*$。这会捕获第 1 组中的时间戳、第 2 组中的 ip,等等。

regex101 demo.

>>> 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')

【讨论】:

  • 很棒的答案!我对正则表达式相当陌生,但是您的回答和 regex101 将帮助我解决这个问题和未来的问题。为此干杯! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 2018-06-18
  • 1970-01-01
相关资源
最近更新 更多