シェルスクリプトでwhois接続拒否メッセージを処理する

シェルスクリプトでwhois接続拒否メッセージを処理する
blacklist_ips='
    5.56.148.140
    94.73.159.66
    69.134.15.72
    107.150.42.226
    195.159.233.44
    89.19.7.58
'

for ipx in $blacklist_ips
do
    country=`whois $ipx | grep -i country | tail -1 | awk '{print $2}'`
    hostx=`host $ipx |awk '{print $NF}'|sed "s/\.$//"`
    printf '%s %s %s' $country $ipx $hostx          
    printf '\n'
done

スクリプトはすべてのIPで動作しますが69.134.15.72

country=`whois $ipx | grep -i country | tail -1 | awk '{print $2}'`

結果は次のとおりです。

connect: Connection refused

だから

whois 69.134.15.72

69.134.15.72正しく反応しないようです。

countryなぜその行で停止し、スクリプトの実行が次の行に達しないのか理解できません。

エラーを検出しconnection refusedて正しく対処する方法は?

ベストアンサー1

ifステートメントを使用してこれを実行し、echo $?最後のコマンドの終了ステータスをテストできます。数値 0 は通常成功を示します。失敗は、プログラムによって一連の数字で表示されることがあります。

ここでは、whois 69.134.15.72; echo $?メッセージによって2が生成されますConnection Refused

接続を許可する他のIPアドレスに対してコマンドを実行すると、ゼロが生成されます。たとえば、

$ whois 5.56.148.140 >/dev/null; echo $?
0

このコマンドは、混乱を避けるために出力を/ dev / nullにリダイレクトします。また、この資料のIPアドレスでこのコマンドを実行する成功または失敗は、将来変更される可能性があります。

コードでは、最初に特定のwhoisIPアドレスのコマンドをテストし、終了ステータスが0の場合にのみforステートメントの残りの部分を実行できます。

それは次のとおりです。

for ipx in $blacklist_ips
do

    whois_test=`whois $ipx 2>/dev/null` 
    ret=$?

    if [ $ret -eq 0 ]; then
        country=`echo "$whois_test" | grep -i country | tail -1 | awk '{print $2}'`
        hostx=`host $ipx |awk '{print $NF}'|sed "s/\.$//"`
        printf '%s %s %s' $country $ipx $hostx          
        printf '\n'
    fi

done

ここで構文は次のとおりです。

  1. whoisIPアドレスに対してコマンドを実行し、出力を変数として保存しますwhois_test。 stderrは/ dev / nullにリダイレクトされ、コマンドが失敗した場合、画面に他の出力は生成されません。
  2. 終了ステータス値を変数に割り当てますret
  3. If ステートメントは、変数の値がret0 であることを確認します。そうであれば、forループの内容で実行が続行されます。

countryforループの変数割り当てが若干変更されました。スクリプトは、もともと作成されたコマンド出力をパイプするのではなく、whois変数の値をパイプしますwhois_test

grep国の正しい値を見つけるためにフォーマットを維持するには、二重引用符が必要です。

おすすめ記事