サーバーでポートが開いているかどうかをチェックするスクリプトを作成したいと思います。開いていない場合はしばらくお待ちください。開いている場合は続行します。ブレーク条件は、「ホストが稼働中」で「クローズ」ではない場合に使用されます。機能は大丈夫だと思います。問題は、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システムで実行します。
問題は、[[$NMAP | grep "Host is up" -ne ""]]
が有効なbash構文とはほど遠いことです。エラーメッセージはそれを修正する方法を正確に伝えていませんが、何かが深刻な問題であることのヒントです。
[[
式]]
は、括弧内にスペースが必要です。 if条件の括弧を参照してください:空白なしで構文エラーが発生するのはなぜですか?|
は、コマンド間のパイプ演算子です。 条件式 の演算子ではありません。実際、[[ foo | bar ]]
はコマンド[[ foo
がコマンドbar ]]
にパイプされたものとして解析されますが、これは何の役にも立ちません。-eq
演算子 は整数を比較しますが、その周りに置くのは整数ではありません。文字列に部分文字列が含まれているかどうかをテストするには、[]条件式で==
演算子を使用します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
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"