1

iptablesのいくつかのIPアドレスを更新するためのスクリプトを作成しました。ここでは、私が直面している問題について説明します。

問題:

  1. スクリプト内の2つの変数間で比較が行われない
  2. スクリプトの最後に、コマンドを実行する必要があります。スクリプトの実行中は、サービスの再起動/停止などとコマンドの出力が表示されます。

1)ここで2つの変数文字列を比較しています:

BASE=172.31.0.0
CMD=172.31.1.0

if [[ "$CMD" == "$BASE" ]]; then
   echo "ip are same"
else
   echo "not matched"
fi

ただし、上記のスクリプトの実行中は応答/出力はありません。ここでは、比較は行われていません。この問題を解決するための最善の解決策を提案してください。

2)スクリプトを実行した後、iptablesを再起動する必要があります。

BASE=172.31.0.0
CMD=172.31.1.0

if [[ "$CMD" == "$BASE" ]]; then
   echo "ip are same"
else
   echo "not matched"
fi

service iptables restart
iptables -nvL

スクリプトは、最後の2行(コマンド)の出力を表示する必要があります。親切に私に最良の解決策とこれを最良の方法で行う方法を提案してください。

4

1 に答える 1

1

それは非常に奇妙です。これは機能するはずなので、機能しない場合は重要なことを言うのを忘れています。

このスクリプトはどのように実行されていますか?単に./scriptと入力しますか、それとも何らかのサービス(cronなど)によって実行されますか?

デバッグするためのいくつかの提案を次に示します。

  1. 健全性チェック:bashが機能するかどうかを確認します(おそらく、ログインシェルがbashではないため、気付かなかったでしょう)。ターミナルでこれを実行します。

    /bin/bash -c 'echo hello world'
    
  2. hello worldを印刷しますよね?これはどう:

    /bin/bash -c 'BASE=172.31.0.0; CMD=172.31.1.0; if [[ "$CMD" == "$BASE" ]]; then echo "ip are same"; else echo "not matched"; fi'
    

    上記のいずれかが機能しない場合は、bashのインストールに問題があります。

  3. ./script.shを使用してスクリプトを実行する代わりに、次のように実行します。

    /bin/bash script.sh
    
  4. 何もない?これを実行します:

    file script.sh
    

    「CRLFラインターミネータ付き」のようなもので終わる場合は、cdarkeがそれを釘付けにしました。ファイルは不適切なツールを使用してWindowsで作成されました。Linuxで再作成するか、dos2unixを使用してください。しかし、とにかく、私はそれを疑っています。なぜなら、CRLF終了ファイルを使用すると、これが印刷されるからです。

    bash: ./script.sh: /bin/bash^M: bad interpreter: No such file or directory
    

    何もない代わりに。

  5. これらの行をファイルの先頭に置きます。

    set -x
    

    #!/ bin / bashの下(ある場合))。これにより、実行中の各コマンドを示すデバッグトレースが確実に出力されます。

  6. それでも何も表示されない場合は、これをスクリプトに配置します(配置する場合はset -xの下に配置します)。

    touch /tmp/hi-this-is-strange
    

    次に、スクリプトを実行した後、 / tmp/hi-this-is-strangeファイルがあるかどうかを確認します。

于 2013-02-14T01:13:13.827 に答える