iptables 命令检查特定行号是否存在规则

iptables 命令检查特定行号是否存在规则

有没有办法检查特定位置是否存在 iptable 规则?

像下面这样:

iptables -C INPUT 1 -j ACCEPT

答案1

解析 的输出iptables -L --line-numbers应该不会那么糟糕:

num=3
if iptables -L foo --line-numbers | grep -qe "^$num "; then
    echo "rule exists at line #$num"
else
    echo "no rule at line #$num"
fi

也就是说,我不确定这有多有用,因为例如从链的开头删除规则会改变其他规则的数量,因此它们不能用作唯一标识符等。您也可以计算链 ( iptables -L foo --line-numbers | sed -ne '$s/ .*//p') 中的规则数量并与之进行比较。

开玩笑地说,一个人可以跑iptables -D foo "$num"。如果在 number 处没有规则$num,它会抱怨,但当然它也是破坏性的......

答案2

我真的很想知道这种检查的用例。

无论如何,您可以使用iptables -S命令,它允许指示规则编号。

然后这将取决于您需要在哪里使用检查结果。

对于您的示例案例,您可能会这样做:

iptables -S INPUT 1 | grep -ce '-j ACCEPT'

获得1打印的grep -c(或0如果不匹配)。

或者在 shell 中,测试可能如下所示:

[ "$(iptables -S INPUT 1)" = '-A INPUT -j ACCEPT' ]

假设您确切地知道要检查的规则。否则,您可以使用[[测试 with=~运算符(如果您的 shell 支持它们)来查找与该规则编号匹配的正则表达式。

相关内容