Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging bash脚本:从语句块捕获错误_Debugging_Bash_Shell_Iptables - Fatal编程技术网

Debugging bash脚本:从语句块捕获错误

Debugging bash脚本:从语句块捕获错误,debugging,bash,shell,iptables,Debugging,Bash,Shell,Iptables,我有一个很大的iptables规则集,我用自己的bash脚本来管理它。脚本中的大多数命令都是简单的单语句iptables命令。我试图通过在脚本执行时添加成功/失败输出来改进脚本 我把剧本分成了不同的部分。一个例子是前向链部分,其中所有规则都应用于前向链。在本节的开头,我输出脚本已经开始应用转发规则,最后,我想输出是否所有规则都已成功应用,或者是否有任何规则不起作用。基本思路如下: #Start FORWARD section echo -ne "Applying FORWARD rules...

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

我把剧本分成了不同的部分。一个例子是前向链部分,其中所有规则都应用于前向链。在本节的开头,我输出脚本已经开始应用转发规则,最后,我想输出是否所有规则都已成功应用,或者是否有任何规则不起作用。基本思路如下:

#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命令可能导致的任何输出或错误,并将它们存储在数组或其他东西中。然后在块的末尾,使用if语句对数组求值,以查看是否存在任何错误。如果没有,则输出[OK]状态,如果有,则输出[FAILED]状态并显示相关错误


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

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

假设每个命令都识别错误,除非一切正常,否则不会看到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]"

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

编写一个函数,为您执行给定命令。然后像使用time、sudo、watch或strace一样使用它。最后一个子shell可以简化:(/usr/local/sbin/finagle it…;test$?=17;)(或者,[$?=17],如果愿意的话)
#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]"