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