有没有办法检查特定位置是否存在 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 支持它们)来查找与该规则编号匹配的正则表达式。