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アドレスでこのコマンドを実行する成功または失敗は、将来変更される可能性があります。
コードでは、最初に特定のwhois
IPアドレスのコマンドをテストし、終了ステータスが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
ここで構文は次のとおりです。
whois
IPアドレスに対してコマンドを実行し、出力を変数として保存しますwhois_test
。 stderrは/ dev / nullにリダイレクトされ、コマンドが失敗した場合、画面に他の出力は生成されません。- 終了ステータス値を変数に割り当てます
ret
。 - If ステートメントは、変数の値が
ret
0 であることを確認します。そうであれば、forループの内容で実行が続行されます。
country
forループの変数割り当てが若干変更されました。スクリプトは、もともと作成されたコマンド出力をパイプするのではなく、whois
変数の値をパイプしますwhois_test
。
grep
国の正しい値を見つけるためにフォーマットを維持するには、二重引用符が必要です。