在我的 iptables 日志文件(Ubuntu 16-04)中,来自 LAN 路由器和 LAN 中其他主机的与 IGMP 相关的所有消息都有“PROTO=2”。有没有办法改变这个并获得“PROTO=IGMP”?
答案1
sed -e "$(awk '/^[[:space:]]*(#|$)/ { next } ;
{ print "s/ PROTO="$2" / PROTO="$3" /;" }' \
/etc/protocols)" /path/to/iptables.log
这用于根据文件的字段 2 和 3awk
构造脚本。然后它在 上运行该脚本。这将转换sed
/etc/protocols
sed
/path/to/iptables.log
全部将日志文件中的协议编号为其相应的名称。
如果您愿意,您可以将脚本的输出保存awk
到文件中(例如调用verbose-proto.sed
然后运行它sed -f
(甚至编辑它以添加#!/bin/sed -f
为第一行并chmod
使其可执行)。例如
$ awk '/^[[:space:]]*(#|$)/ { next } ;
{ print "s/ PROTO="$2" / PROTO="$3" /;" }' \
/etc/protocols > ./verbose-proto.sed
$ printf "%s\n" 1 i '#!/bin/sed -f' . w | ed -s verbose-proto.sed
$ chmod +x ./verbose-proto.sed
$ ./verbose-proto.sed /path/to/iptables.log
如果您只想将一个协议号更改2
为IGMP
,则要简单得多:
sed -e 's/ PROTO=2 / PROTO=IGMP /' /path/to/iptables.log
(该awk
脚本使用正则表达式搜索和替换规则生成大约 50 行,如下所示 - 对应 中的每个已知协议/etc/protocols
)