检查 iptables 是否正在运行的脚本不起作用

检查 iptables 是否正在运行的脚本不起作用

我有以下简单脚本来检查 iptables 是否正在运行。为什么无论状态如何,它总是返回“OK”?

#!/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

答案1

iptables 的 init 脚本永远不会返回该字符串;它里面总会有其他内容,而且还存在与该字符串完全不匹配的失败情况。

相反,您应该检查脚本的退出代码,因为如果防火墙未处于活动状态,则它(在 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

答案2

您正在设置$SERV为等于文字字符串值“ /sbin/service iptables status”,您需要它来执行命令并存储结果。您可以通过回显来验证这一点$SERV。正如所写,它将始终计算为不相等。

SERV=$(/sbin/service iptables status)

另外,确保输出符合预期。我的版本返回iptables: Firewall is not running. (当然您的版本可能会有所不同。)

了解更多关于子壳的信息,请访问高级 Bash 脚本指南

答案3

脚本正在执行其所说的操作。请记住 [ "$SERV" = "$EXPR" ] 正在比较字符串,并且它们不相等。

因此,测试的退出状态将始终为非零,所以将始终转到“else”。

你需要使用命令替换,而不是 SERV='/sbin/service iptables status' 你应该使用

SERV="$(/sbin/service iptables status)"

或者

SERV=`/sbin/service iptables status`

高血压

相关内容