此语句以交互方式运行,但不是从 'at' scheduled

This statement runs interactively but not from 'at' scheduled

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 }')" -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 插入任务,因为括号内的比较是错误的(我使用了一个 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,它也会计算为 false。谁能明白为什么我不能比较两个零是否相同?我怎样才能按照我想要的方式制作我想要的语句 b运行ch :当替换的命令等于零时?它的行为与命令行不同,并且正确如预期。我的猜测是 shell 的差异。我尝试使用双括号。没有运气。 ([]) 也不起作用。使用 eq 代替 == 也不行。

运行 从 at 你没有控制终端,很可能 iptables 改变了它的输出格式。你在 grep 上需要 --line-buffered 的事实表明有问题。

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

@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' 是可选的。