У меня есть следующий простой скрипт, чтобы проверить, работает ли iptables или нет. Почему он всегда возвращает «ОК» независимо от статуса?
#!/bin/bash
#IPT='iptables'
SERV='/sbin/service iptables status'
EXPR='Firewall is stopped.'
if [ "$SERV" = "$EXPR" ]
then
echo 'Firewall is not Running'
exit 2
else
echo 'OK'
exit 0
fi
Сценарий инициализации для iptables никогда не вернет именно эту строку; в нем всегда будет что-то еще, а также есть условия отказа, которые вообще не соответствуют этой строке.
Вместо этого вы должны проверить код выхода из сценария, поскольку он (в EL и Fedora) возвращает ненулевое значение, если брандмауэр не активен, и ноль, если он активен.
/sbin/service iptables status >/dev/null 2>&1
if [ $? = 0 ]; then
echo "All systems go."
else
echo "Houston, we have a problem."
fi
Вы устанавливаете $SERV
чтобы равняться буквальному строковому значению "/sbin/service iptables status
", он необходим для выполнения команды и сохранения результат. Вы можете убедиться в этом, повторив $SERV
. Как написано, он всегда будет оцениваться как неравный.
SERV=$(/sbin/service iptables status)
Также убедитесь, что результат соответствует ожиданиям. Моя версия возвращается iptables: Firewall is not running.
(Ваше, конечно, может отличаться.)
Узнайте больше о подоболочках на Расширенное руководство по сценариям на Bash.
Скрипты делают то, что говорят. Имейте в виду, что ["$ SERV" = "$ EXPR"] сравнивает струны , и они не равны.
Таким образом, статус выхода теста всегда будет отличным от нуля, поэтому всегда будет переходить в «else».
Вам нужно использовать Подстановка командвместо SERV = '/ sbin / service iptables status' следует использовать либо
SERV="$(/sbin/service iptables status)"
или
SERV=`/sbin/service iptables status`
HTH