【问题标题】:How to get unique IP (and number of banned times) from fail2ban logs如何从 fail2ban 日志中获取唯一 IP(和禁止次数)
【发布时间】:2021-04-02 22:13:34
【问题描述】:

我有很多来自fail2ban 日志的禁止IP。这有这种格式:

[...]
2021-02-28 00:03:33,818 fail2ban.filter         [687]: INFO    [sshd] Found 193.142.146.33 - 2021-02-28 00:03:33
2021-02-28 00:07:17,068 fail2ban.filter         [687]: INFO    [sshd] Found 193.142.146.33 - 2021-02-28 00:07:16
2021-02-28 00:08:49,568 fail2ban.filter         [687]: INFO    [sshd] Found 142.93.234.120 - 2021-02-28 00:08:49
[...]

我想将其转换为具有禁止次数的唯一 IP 列表(与前面的示例一样):

2 193.142.146.33
1 142.93.234.210

评论:uniqzcat /var/log/fail2ban.log.4.gz | grep ssh | uniq -c - | less)不起作用,因为拍摄时间不同。所以在调用uniq之前我需要一些预处理。

【问题讨论】:

  • 看来zcat /var/log/fail2ban.log.4.gz | grep -Eo "[^^][0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | uniq -c | sort 解决了我的问题。有更好的解决方案吗?
  • 注意:[^^] 与行首不匹配,表示不是^ 字符的字符 - 查看示例似乎无关紧要。
  • 另请注意,您的原始文件将过滤掉不是来自 sshd 的其他 IP 地址...修改后的内容将匹配包括 IP 地址在内的其他内容

标签: shell logging uniq fail2ban


【解决方案1】:

假设日志的所有行都遵循与这三个相同的模板,任何地方都没有多余的空格:

zcat /var/log/fail2ban.log.4.gz | awk '{ print $8 }' | sort | uniq -c | sort -k1,1rn

请注意,uniq 期望其输入被排序。管道中的最终sort 将首先显示出现频率最高的地址。


或者使用perlRegexp::Common模块来获得一个健壮的正则表达式来从每一行中提取所有的IPv4地址:

zcat /var/log/fail2ban.log.4.gz | perl -MRegexp::Common=net -nE 'say for m/\b$RE{net}{IPv4}\b/g' | sort | uniq -c | sort -k1,1rn

【讨论】:

  • awk '{ print $8 }' 的真正含义是什么?
  • 打印每行的八列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 2016-07-10
  • 2010-11-09
  • 1970-01-01
相关资源
最近更新 更多