debugging - bash 脚本 : catching errors from a block of statements

标签 debugging bash shell iptables

我有一个大型 iptables 规则集,我使用自己的 bash 脚本进行管理。脚本中的大多数命令都是简单的单语句 iptables 命令。我正在尝试通过在脚本执行时添加成功/失败输出来改进脚本。

我将脚本分成不同的部分。一个例子是 FORWARD 链部分,其中所有规则都应用于 FORWARD 链。在本节的开头,我输出脚本已开始应用 FORWARD 规则,最后,我想输出是否所有规则都已成功应用,或者是否有任何规则不起作用。这是基本思想:

#Start FORWARD section
echo -ne "Applying FORWARD rules..."

#rule 1
/sbin/iptables -A FOWRARD...

#rule 2
/sbin/iptables -A FORWARD...

echo -ne "\t\t\t[OK]\n"

我想做的是捕获每个 iptables 命令可能产生的任何输出或错误,并将它们存储在数组或其他东西中。然后在 block 的末尾,使用 if 语句评估数组以查看是否有任何错误。如果没有,输出[OK]状态,如果有,输出[FAILED]状态,并显示相关错误。

有没有一种方法可以对整个规则 block 执行此操作,而无需将每个 iptables 规则包装在 if [ $? != 0 ] 表达式?

最佳答案

set -e 选项(第一次失败时退出),或者:

#rule 1
/sbin/iptables -A FORWARD ... &&

#rule 2
/sbin/iptables -A FORWARD ... &&

echo "[OK]"

假设每个命令都识别出错误,除非一切正常,否则您不会看到 OK。

如果您必须处理具有非零但成功退出状态的顽固进程,那么您可以将此类命令嵌入到处理该问题的子 shell 中:

#rule 1
/sbin/iptables -A FORWARD ... &&

#rule 2
/sbin/iptables -A FORWARD ... &&

# Unusual process - finagle-it returns status 17 on success
(
/usr/local/sbin/finagle-it ...
if [ $? = 17 ]; then exit 0; else exit 1; fi
) &&

echo "[OK]"

请注意,当 finagle-it 在子 shell 中运行时,必须取消 set -e

关于debugging - bash 脚本 : catching errors from a block of statements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6752318/

相关文章:

c++ - 在 VS6 中批量更改项目构建配置

debugging - 我如何知道故障转储的 CLR 版本?

Android包不可调试

c - 加载.dmp文件定位错误代码,但崩溃发生在意想不到的地方(在ntdll.dll中)

bash - 如何将变量从 awk 传递到 shell

git - 如何使用 git show with pretty 或仅提供提交消息摘要的格式?

bash - 是否有 grep : finding short lines in long patterns? 的反函数

bash - 带有变量比较的 if 语句在 bash shell 中不起作用

linux - shell找不到nginx

linux - 在 Linux 中打印文件的第 3、4 和 5 行