Nmap は bash でポートが開いていることを確認します。

Nmap は bash でポートが開いていることを確認します。

サーバーでポートが開いていることを確認するスクリプトを作成したいと思います。開かない場合はしばらく滞在してください。開いている場合は続けます。使用される割り込み条件は「終了」ではなく「ホスト動作中」です。接続が良くなったようです。問題は、grepが期待どおりに機能しないことです。

私は以下を試しました:

while true; do
 NMAP=$(nmap -p 1700 router.eu.thethings.network)
 if [[$NMAP | grep "Host is up" -ne ""]] && [[$NMAP | grep "closed" -eq ""]]; then
    echo "connection!!!"
    break
 fi


 echo "waiting for connectiong"
 done

私はRaspberry Pi Jesseシステムで実行しています。

答え1

nmap -p 1700 router.eu.thethings.network

ホストネットワークが動作していてポートでリッスンしているものがない場合は、「Host is up」が印刷されます。代わりに使用してくださいnc

if nc -w1 -z router.eu.thethings.network 1700; then
  echo "Port is listening"
else
  echo "Port is not listening"
fi

答え2

問題は、これが[[$NMAP | grep "Host is up" -ne ""]]有効なbash構文と距離が離れていることです。エラーメッセージは、問題を解決する方法を正確には示していませんが、深刻な問題が発生したことを示唆しています。

文字列に部分文字列が含まれているかどうかをテストするには、次のようにします。誰でも==条件式に演算子を使用してください。またはgrepを介してパイプします(条件式は含まれません)。 grepを使用すると、$NMAPコマンドとして実行するのではなく、grepに入力として渡したいので、echoパイプに入れる必要があります。-q出力ではなく戻り状態にのみ興味があるため、grepに渡されました。

if echo "$NMAP" | grep "Host is up"  && echo "$NMAP" | grep "closed"; then …

条件式を使用してください。

if [[ $NMAP == *"Host is up"* || $NMAP == *"closed"* ]]; then …

必ず読むべき演算子について混乱している[[ vs [ vs ( ( vs ((条件式を説明し、これが条件が真であるかどうかをテストする唯一の方法ではない理由を説明します。また必ずお読みくださいスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?

答え3

Host is up以下は、成功したときと何も返されない場合の例です。grepHost is downgrep

NMAP=$(nmap -p 1700 router.eu.thethings.network)
(NMAP$ | grep "Host is up") &>/dev/null && echo "Host is up" || echo "Host is down"

関連情報