谈天说地

如何在shell中判断iptables是否开启

在chinaunix forum中一个网友问的问题:http://bbs.chinaunix.net/viewthread.php?tid=1272883&pid=9317530&page=1&extra=#pid9317530

帖子的问题是:

看到有个脚本中是这么做的:
/sbin/service iptables status 1>/dev/null 2>&1
if [ $? -ne 0 ]; then
_firewall_status=”stopped”
fi

不知道这么做是否正确?如果正确的话,原理是什么?
谢谢!

我回答是:

这脚本应该没问题。
首先$?在shell中表示上一个命令的返回值。往往0表示成功。非0表示失败。
其次,我查看了下/etc/init.d/iptables脚本的内容(此查找路径仅保证在fedora中有效)。
其中关于status的代码你可以看看,大概在275行。
在iptables关闭时下会返回3。成功则返回0。

iptables脚本中关于status函数的脚本如下,其中加黑字体的表示返回值部分:

status() {
if [ ! -f “$VAR_SUBSYS_IPTABLES” -a -z “$NF_TABLES” ]; then
echo $”${IPTABLES}: Firewall is not running.”
return 3
fi

# Do not print status if lockfile is missing and iptables modules are not
# loaded.
# Check if iptable modules are loaded
if [ ! -e “$PROC_IPTABLES_NAMES” ]; then
echo $”${IPTABLES}: Firewall modules are not loaded.”
return 3
fi

# Check if firewall is configured (has tables)
if [ -z “$NF_TABLES” ]; then
echo $”${IPTABLES}: Firewall is not configured. ”
return 3
fi

NUM=
[ “x$IPTABLES_STATUS_NUMERIC” = “xyes” ] && NUM=”-n”
VERBOSE=
[ “x$IPTABLES_STATUS_VERBOSE” = “xyes” ] && VERBOSE=”–verbose”
COUNT=
[ “x$IPTABLES_STATUS_LINENUMBERS” = “xyes” ] && COUNT=”–line-numbers”

for table in $NF_TABLES; do
echo $”Table: $table”
$IPTABLES -t $table –list $NUM $VERBOSE $COUNT && echo
done

return 0
}

over~

发表您的评论

请您放心,您的信息会被严格保密。必填项已标识 *