Назад | Перейти на главную страницу

Скрипт для проверки работы iptables не работает

У меня есть следующий простой скрипт, чтобы проверить, работает ли 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