You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:05:11