0
if [ $(/sbin/iptables -w -L INPUT -n|grep --line-buffered -m 1 -c -w 66.128.56.213) == "0" ]; then /sbin/iptables -w -I INPUT "$(/sbin/iptables -w -L INPUT -n --line-numbers|stdbuf -o0 grep -m 1 -w DROP|stdbuf -o0 awk  '{print $1}')" -i eth0 -s 66.128.56.213 -m comment --comment 'kern.log Oct 27 23:14:10 PROTO=UDP SPT=5118 DPT=5060' -j DROP;fi

Ubuntu headless 15.10: 上記のステートメントは、開発中のスクリプトによって「at」でスケジュールされました。括弧内の比較が偽であるため、実行時に期待される iptables 挿入タスクを実行しませんでした (それを知るために、表示されていない else を使用しました)。ゼロの引用符を変更しようとしました...引用符なし、一重引用符、および二重引用符。'==' の前の値が 0 であることはわかっています。これは、上記のコマンドの前に、構築されたスケジュールされたコマンドに挿入したためです。 echo $(/sbin/iptables -w -L INPUT -n|grep --line-buffered -m 1 -c -w 66.128.56.213) >> /home/mydir/testfile.txt

そして、単純な 0 をファイルにエコーしました。そして、括弧内で 0 == 0 を試してみると、それも false として計算されます。2 つのゼロを比較して互いに同じにできない理由がわかる人はいますか? そして、どうすれば目的のステートメントを希望どおりに分岐させることができますか: 置換されたコマンドがゼロに等しい場合? コマンドラインとは異なり、期待どおりに正しく動作します。私の推測では、シェルの違いです。二重括弧を使用してみました。運がない。([]) も機能しません。== の代わりに eq を使用することもできません。

4

2 に答える 2

0

@abligh、試してくれてありがとう。答えは、「at」コマンドを対話的にロードするときにのみ表示される警告にあります。

`warning: commands will be executed using /bin/sh'

/bin/sh でのこれの正しい構文は次のとおりです。

if [ $(/sbin/iptables -w -L INPUT -n|grep --line-buffered -m 1 -c -w 66.128.56.213) -eq 0 ]; then...

grep の出力はテキストではなく数値であるため、引用符は削除され、「==」は「-eq」に置き換えられます。「if」はオプションです。

于 2015-10-28T08:02:04.593 に答える
0

あなたから実行atすると、制御端末がなくiptables、出力形式が変更される可能性が非常に高くなります。あなたが必要とするという事実は、何かが間違っていること--line-bufferedを示しています。grep

代わりに、iptables-save予測可能な機械解析可能な出力形式を生成する which を使用します。

于 2015-10-28T07:15:04.983 に答える