web-dev-qa-db-ja.com

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 Pijessieシステムで実行します。

1
Peter Savnik

問題は、[[$NMAP | grep "Host is up" -ne ""]]が有効なbash構文とはほど遠いことです。エラーメッセージはそれを修正する方法を正確に伝えていませんが、何かが深刻な問題であることのヒントです。

文字列に部分文字列が含まれているかどうかをテストするには、[]条件式で==演算子を使用しますor 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(( これは、条件式と、それらが条件が真であるかどうかをテストする唯一の方法ではない方法を説明します。また、読み取り なぜシェルスクリプトが空白やその他の特殊文字を窒息させるのですか?

nmap -p 1700 router.eu.thethings.network

ホストネットワークが起動していて、ポートでリッスンしているものがない場合、「Hostisup」と出力されます。代わりにncを使用してください:

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

grepが成功したときにHost is upを表示し、grepが何も返さないときにHost is downを表示する例があります。

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