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: Вышеприведенное утверждение было запланировано в моем сценарии, который я разрабатываю. Он не выполнил ожидаемую задачу вставки 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. Может ли кто-нибудь понять, почему я не могу сравнить два нуля, чтобы они были одинаковыми? И как я могу сделать желаемую ветвь оператора так, как я хочу: когда подставленная команда равна нулю? Он действует иначе и правильно, как и ожидалось, из командной строки. Думаю, разница в оболочке. Я пробовал использовать двойные скобки. Неудачно. ([]) тоже не работает. Также не используется использование eq вместо ==.

0
kenneth558 28 Окт 2015 в 09:24

2 ответа

Лучший ответ

@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' не является обязательным.

0
kenneth558 30 Окт 2015 в 05:39

При запуске из at у вас нет управляющего терминала, и вполне возможно, что iptables изменит свой выходной формат. Тот факт, что вам нужен --line-buffered на grep, указывает на то, что что-то не так.

Вместо этого используется iptables-save, который создает предсказуемый формат вывода, пригодный для машинного анализа.

0
abligh 28 Окт 2015 в 07:15