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无头15.10:
上面的陈述是在我正在开发的脚本的'at'中安排的。它在运行时没有执行预期的iptables插入任务,因为括号内的比较是假的(我使用了其他的,未显示,以了解这一点)。我试过更改零的引用...没有引号,单引号和双引号。我知道'=='之前的值是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代替==。
答案 0 :(得分:0)
从at
运行,您没有控制终端,很可能iptables
更改其输出格式。 --line-buffered
上需要grep
的事实表明出现了问题。
相反,使用iptables-save
生成可预测的机器可解析输出格式。
答案 1 :(得分: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'是可选的。