0
if [ $(/sbin/iptables -w -L INPUT -n|grep --line-buffered -m 1 -c -w 66.128.56.213) == "0" ]; then /sbin/iptables -w -I INPUT "$(/sbin/iptables -w -L INPUT -n --line-numbers|stdbuf -o0 grep -m 1 -w DROP|stdbuf -o0 awk  '{print $1}')" -i eth0 -s 66.128.56.213 -m comment --comment 'kern.log Oct 27 23:14:10 PROTO=UDP SPT=5118 DPT=5060' -j DROP;fi

Ubuntu headless 15.10:我正在开发的脚本将上述语句安排在“at”中。它在运行时没有执行预期的 iptables 插入任务,因为括号内的比较是错误的(我使用了一个未显示的 else 来了解这一点)。我尝试过更改零的引用...无引号、单引号和双引号。我知道 '==' 之前的值是 0,因为我在上面显示的内容之前将它插入到构造的预定命令中: echo $(/sbin/iptables -w -L INPUT -n|grep --line-buffered -m 1 -c -w 66.128.56.213) >> /home/mydir/testfile.txt

它在文件中回显了一个简单的 0。如果我只是在括号中尝试 0 == 0,它也会计算为假。谁能明白为什么我不能比较两个零彼此相同?以及如何按照我想要的方式使我想要的语句分支:当替换的命令等于零时?它与命令行的行为不同,并且按预期正确。我的猜测是外壳差异。我尝试使用双括号。没运气。([]) 也不起作用。也不用 eq 代替 ==。

4

2 回答 2

0

at您那里运行没有控制终端,并且很可能会iptables更改其输出格式。你需要的事实--line-buffered表明grep有问题。

相反,使用iptables-save产生可预测的机器可解析输出格式。

于 2015-10-28T07:15:04.983 回答
0

@abligh,感谢您的尝试。答案在您只会在交互式加载“at”命令时看到的警告中找到:

`warning: commands will be executed using /bin/sh'

/bin/sh 中的正确语法是:

if [ $(/sbin/iptables -w -L INPUT -n|grep --line-buffered -m 1 -c -w 66.128.56.213) -eq 0 ]; then...

grep 输出是数字,而不是文本,因此引号被删除,'==' 被'-eq' 替换,'if' 是可选的。

于 2015-10-28T08:02:04.593 回答