如何使用awk从httpd错误日志中提取纯IP,适配已有SSH拦截脚本逻辑
httpd错误日志异常IP筛选方案
失效原因
原有命令无法生效有两个核心问题:
- 提取的
$10/$12字段末尾自带]符号,并非纯IP:端口内容 - IP与端口绑定在一起,需要拆分出单独IP后再统计
适配后的命令
可以通过awk的split函数拆分字段提取纯IP,完全保留原有统计逻辑的命令如下:
tail -1000 /var/log/httpd/error_log | awk '/denied/ && /client/ { if (/invalid user/) { split($12, addr_arr, /:|\]/) } else { split($10, addr_arr, /:|\]/) } try[addr_arr[1]]++ } END { # 可自定义异常次数阈值,示例为出现5次即判定为异常 for(ip in try) if(try[ip] >= 5) print ip }'
对接拦截逻辑说明
直接将上述awk逻辑替换原有SSH拦截脚本中的日志筛选部分,输出的异常IP直接传入iptables/firewalld封禁命令即可,和原有SSH暴力破解拦截逻辑完全兼容。
补充说明:如果你的httpd错误日志为自定义格式,字段位置可能有变动,可以先执行
tail -1 /var/log/httpd/error_log | awk '{print $10}'确认IP:端口]所在字段序号,将上述命令中的$10/$12修改为对应序号即可。
内容的提问来源于stack exchange,提问作者striker
相关产品推荐
相关产品推荐

