我試著理解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
你的命令本身沒有什麼意義。由於您沒有提供在遠端伺服器上執行的命令,因此將以請求偽終端並啟動遠端使用者的登入 shell(或可能是 ForcedCommand)的模式ssh
運行。rlogin
然後,您對輸出套用多個篩選器:
grep -v "Connection refused"
:過濾掉其中的任何行輸出其中包含Connection refused
.這沒有什麼意義,因為如果錯誤訊息出現,它會寫在 stderr 上,而不是正在過濾的標準輸出上grep
,而且還因為:grep "Connected to"
:僅選擇包含 的行Connected to
。這也會排除包含的行,Connection refused
因為一行不太可能同時包含兩者。grep -v grep
,也要刪除包含的行grep
(這樣就成為同時包含Connected to
andgrep
和 not的行Connection refused
!)wc -l
:計算結果行數(因此ssh
的 stdout 中包含的行Connected to
除外,也包含grep
或Connection refused
)。請注意,wc
僅當連線關閉時、shell 會話終止時(例如使用者輸入 時)才會輸出該數字exit
。但話又說回來,由於用戶不會看到任何輸出(因為這一切wc
最終都會發生),因此用戶幾乎不知道他需要輸入exit
才能終止該會話。
答案2
grep
它排除包含先前管道輸出中的字母序列的所有行。