此语句以交互方式运行,但不是从 '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' 是可选的。
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' 是可选的。