Bash 4.4.0(Ubuntu16.04):提取日志列构造apf封禁命令失败求助
解决Bash脚本生成APF封禁命令的问题
我看了你在Ubuntu 16.04(Bash 4.4.0)下的脚本问题——你想处理.syncflood-violations.log里的每行内容,提取第6列的IP放到行首生成APF封禁命令,但现有脚本里的echo语句没法正常工作,对吧?
首先先确认你的源文件.syncflood-violations.log内容是这样的:
[Thu Nov 14 17:08:19 2019] SRC=178.128.184.16 DST=XXX.XXX.XXX.XXX SPT=57858 DPT=80 [Mon Nov 18 19:29:42 2019] SRC=83.248.31.89 DST=XXX.XXX.XXX.XXX SPT=54667 DPT=40033 [Tue Nov 19 14:45:11 2019] SRC=47.92.201.62 DST=XXX.XXX.XXX.XXX SPT=50322 DPT=80 [Wed Nov 20 14:30:02 2019] SRC=104.152.52.32 DST=XXX.XXX.XXX.XXX SPT=56417 DPT=5938 [Mon Nov 25 05:20:42 2019] SRC=92.246.84.85 DST=XXX.XXX.XXX.XXX SPT=45576 DPT=80
你的原脚本有几个核心问题:
while read -r line循环里的awk '{ print $6 }'没有接收当前读取的行,它会一直等待输入,导致变量Banip无法正确赋值- 脚本存在语法错误,比如变量赋值后未闭合引号、分号位置混乱,导致后续
echo语句根本无法执行 - 逐行调用awk的方式效率很低,不如直接用awk一次性处理整个文件
修正后的解决方案
我给你两种实用的处理方式,第一种是直接用awk处理日志生成封禁命令,简单高效:
# 直接生成符合要求的APF封禁命令到banthem.sh awk '{ # 提取第6列的纯IP:$6是"SRC=xxx.xxx.xxx.xxx",从第5个字符开始截取就是IP部分 src_ip = substr($6, 5) # 格式化输出APF命令,把整行内容用双引号括起来 printf "/usr/local/sbin/apf -d %s \"%s\"\n", src_ip, $0 }' .syncflood-violations.log > banthem.sh
如果要把收集日志和生成命令整合在一起,完整脚本可以写成这样:
# 第一步:收集去重的SYN Flood违规日志到.syncflood-violations.log dmesg -T | grep -- 'INSYN_SRC_LIMIT' | \ awk '{ print $1,$2,$3,$4,$5,$11,$12,$19,$20,$21 }' | \ sed -e 's/PROTO=TCP//g; s/WINDOW.*//g' | \ column -t | \ awk '!seen[$6]++' > .syncflood-violations.log # 第二步:生成APF封禁命令到banthem.sh awk '{ src_ip = substr($6, 5) printf "/usr/local/sbin/apf -d %s \"%s\"\n", src_ip, $0 }' .syncflood-violations.log > banthem.sh
预期输出
执行完上面的脚本后,banthem.sh里的内容会完全符合你的期望:
/usr/local/sbin/apf -d 178.128.184.16 "[Thu Nov 14 17:08:19 2019] SRC=178.128.184.16 DST=XXX.XXX.XXX.XXX SPT=57858 DPT=80" /usr/local/sbin/apf -d 83.248.31.89 "[Mon Nov 18 19:29:42 2019] SRC=83.248.31.89 DST=XXX.XXX.XXX.XXX SPT=54667 DPT=40033" /usr/local/sbin/apf -d 47.92.201.62 "[Tue Nov 19 14:45:11 2019] SRC=47.92.201.62 DST=XXX.XXX.XXX.XXX SPT=50322 DPT=80" /usr/local/sbin/apf -d 104.152.52.32 "[Wed Nov 20 14:30:02 2019] SRC=104.152.52.32 DST=XXX.XXX.XXX.XXX SPT=56417 DPT=5938" /usr/local/sbin/apf -d 92.246.84.85 "[Mon Nov 25 05:20:42 2019] SRC=92.246.84.85 DST=XXX.XXX.XXX.XXX SPT=45576 DPT=80"
内容的提问来源于stack exchange,提问作者Vituvo
相关产品推荐
相关产品推荐

