
Я относительно «новичок» в мире Linux и bash и не могу в этом разобраться.
Среди прочего я хочу изменить iptables, если 'string' там не существует, но это, похоже, не работает. Не уверен, связано ли это с операторами if, кодом выхода, синтаксисом или разрешениями sudo или чем-то другим.
Когда скрипт запускается автоматически через cron, он выполняет if
предложение, даже если iptables
оно содержит строку, которую я ищу. Это проверено
- печать iptables в терминале за секунды до и после запланированного запуска
- путем добавления
echo "this" >>/log/file.log
к предложению if.
Дубль 1:
#!/bin/bash
iptables -L -n -v | grep 8.8.8.8
if [ $? != 0 ]; then
command-to-perform
fi
Дубль 2:
#!/bin/bash
iptablesvar=$(iptables -L -v -n)
if [[ $iptablesvar != *"8.8.8.8"* ]]; then
command-to-perform
fi
Я попробовал оба варианта, запустив (sudo) crontab со следующей строкой:
*/1 * * * * /bin/bash /home/username/path/to/script-file.sh
Меня сбивает с толку то, что оба варианта выше работают, если их ввести непосредственно в терминал, например так:
sudo iptables -L -n -v | grep 8.8.8.8
if [ $? != 0 ]; then echo "not found" ;fi
if [ $? == 0 ]; then echo "found" ;fi
var=$(sudo iptables -L -n -v)
if [[ $var != *"8.8.8.8"* ]]; then echo "n" ;fi
if [[ $var == *"8.8.8.8"* ]]; then echo "y" ;fi
Что дает?
Если это важно, моя система — это свежий Linux Mint 19.3 Tricia
решение1
Тогда я сам отвечу на этот вопрос - все заслуги@steeldriver'sкомментарий:
iptables
отсутствует в cron PATH
. Изменена команда для включения полного пути /sbin/iptables
.