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