我有以下简单脚本来检查 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`
高血压