サーバーでポートが開いていることを確認するスクリプトを作成したいと思います。開かない場合はしばらく滞在してください。開いている場合は続けます。使用される割り込み条件は「終了」ではなく「ホスト動作中」です。接続が良くなったようです。問題は、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構文と距離が離れていることです。エラーメッセージは、問題を解決する方法を正確には示していませんが、深刻な問題が発生したことを示唆しています。
[[
表現する]]
角かっこ内にはスペースが必要です。バラよりif条件の括弧:スペースなしで構文エラーが発生するのはなぜですか?|
コマンド間のパイプ演算子です。その人はオペレーターではありません条件式。実際、これは[[ foo | bar ]]
コマンドにパイプされたコマンドに解析され、有用な操作を実行しません。[[ foo
bar ]]
- これ
-eq
オペレーター整数を比較しますが、その周りに置いたものは整数ではありません。
文字列に部分文字列が含まれているかどうかをテストするには、次のようにします。誰でも==
条件式に演算子を使用してください。または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
以下は、成功したときと何も返されない場合の例です。grep
Host is down
grep
NMAP=$(nmap -p 1700 router.eu.thethings.network)
(NMAP$ | grep "Host is up") &>/dev/null && echo "Host is up" || echo "Host is down"