私はgrep -v grep
以下が何を意味するのか理解しようとしています:
ssh $server -p $port -o "ConnectTimeout 5" | grep -v "Connection refused" | grep "Connected to" | grep -v grep | wc -l
または、TCP 接続テストを見つけるより良い方法はありますか?
答え1
5 秒以内に ssh 接続を確立してコマンドを実行できるかどうかを確認するには、次のようにします。
if ssh -o BatchMode=yes -o ConnectTimeout=5 -p "$port" "$server" true; then
printf '%s\n' "$server is up"
fi
そのままのコマンドはあまり意味がありません。リモート サーバーで実行するコマンドを指定していないため、擬似端末が要求され、リモート ユーザーのログイン シェル (または ForcedCommand) が起動されるモードssh
で実行されますrlogin
。
次に、出力にいくつかのフィルターを適用します。
grep -v "Connection refused"
: から任意の行をフィルタリングします出力が含まれていますConnection refused
。このエラー メッセージは、フィルタリングされている標準出力ではなく stderr に書き込まれるため、あまり意味がありません。grep
また、次の理由もあります。grep "Connected to"
: を含む行のみを選択します。行に両方が含まれる可能性は低いため、Connected to
を含む行も除外されます。Connection refused
grep -v grep
、 を含む行も削除しますgrep
(つまり、Connected to
とgrep
の両方を含み、 を含まない行になりますConnection refused
)。wc -l
: 結果の行数をカウントします (つまり、ssh
の stdout内の またはもConnected to
含む行を除く を含む行)。は、ユーザーが を入力したときのように、接続が閉じられ、シェル セッションが終了したときにのみその数を出力することに注意してください。しかし、ユーザーには出力がまったく表示されないため (最終的にはすべて に行くため)、そのセッションを終了するために を入力する必要があることをユーザーにはほとんどわかりません。grep
Connection refused
wc
exit
wc
exit
答え2
grep
前のパイプ出力から文字シーケンスを含むすべての行を除外します。