4

独自の bash スクリプトで管理する大きな iptables ルールセットがあります。スクリプト内のコマンドのほとんどは、単純な単一ステートメントの iptables コマンドです。スクリプトの実行時に成功/失敗の出力を追加して、スクリプトを改善しようとしています。

スクリプトをさまざまなセクションに分割しました。1 つの例は、すべてのルールが 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 コマンドから生じる可能性のある出力またはエラーをキャッチし、それらを配列などに格納することです。次に、ブロックの最後で if ステートメントを使用して配列を評価し、エラーがないかどうかを確認します。そうでない場合は [OK] ステータスを出力し、ある場合は [FAILED] ステータスを出力し、関連するエラーを表示します。

各 iptables ルールを if [ $ でラップせずに、ルールのブロック全体に対してこれを行う方法はありますか? != 0 ] 式?

4

1 に答える 1

2

set -eオプション(最初の失敗で終了)、または:

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

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

echo "[OK]"

各コマンドがエラーを識別すると仮定すると、すべてが機能しない限り、OKは表示されません。

ゼロではないが正常な終了ステータスを持つ扱いにくいプロセスを処理する必要がある場合は、そのようなコマンドを、問題を処理するサブシェルに埋め込みます。

#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]"

set -eが実行されるときにキャンセルする必要があることに注意してくださいfinagle-it-サブシェル内。

于 2011-07-19T20:34:41.660 に答える