Linux
bash + 如何將 ssh 測試作為程序執行
在我的 bash 腳本中,我使用以下語法來測試 ssh 連接測試
IP=12.3.4.55 sshpass -p secret123 /usr/bin/ssh -n -o ConnectTimeout=100 -o StrictHostKeyChecking=no -xaq -q root@$IP exit [[ $? -eq 0 ]] && echo ssh test is ok || echo ssh test is fail
但我想用 & 來做(所以所有 ssh 行都將執行 ss 程序)
所以我做了這個
IP=12.3.4.55 sshpass -p secret123 /usr/bin/ssh -n -o ConnectTimeout=100 -o StrictHostKeyChecking=no -xaq -q root@$IP exit & [[ $? -eq 0 ]] && echo ssh test is ok || echo ssh test is fail
但是作為上面最後一個範例的 ssh 測試即使 IP 地址錯誤也有效,所以即使 ssh 也失敗了 $? 儘管 ssh 測試失敗,但得到 0
那麼如何使用 & 設置所有 ssh 語法?
注意 - 我想線上添加 & 的原因是因為我們需要掃描超過 1000 台 linux 機器並且使用 & 它會更快
如果您關心結果,那麼在某些時候您必須
wait
在後台/子外殼中執行命令時獲得結果(在 TLDP https://tldp.org/LDP/abs/html/subshel ls.html 了解更多資訊)。在範例中,檢查的是它的“create-a-subshell”部分是否成功,而不是“在子 shell 中執行的內容”。
你也可以做這樣的事情 - 有一個在子shell中執行的函式……
#!/bin/bash testIp() { ip=$1 user=$2 sshpass ... ssh -n -o ConnectTimeout=100 -o StrictHostKeyChecking=no -xaq -q $USER@$IP exit [[ $? = 0 ]] && echo ssh test is ok || echo ssh test is fail } ( testIp YOURIP root ) & ( testIp YOUROTHERIP root2 ) &
只需將測試移動到一個函式中,這樣您的腳本就可以在後台執行它並並行測試多個連接:
#!/bin/bash testConnection(){ user=$1 ip=$2 sshpass -p secret123 /usr/bin/ssh -n -o ConnectTimeout=100 -o StrictHostKeyChecking=no -xaq -q "$user"@"$ip" exit [[ $? = 0 ]] && echo "$user@$ip OK" || echo "$user@$ip FAILED" } users=( terdon terdon ) ips=( 123.4.5.6 127.1.0.0 ) for ((i=0;i<${#users[@]};i++)); do testConnection "${users[i]}" "${ips[i]}" & done ## The script should wait and not exit until ## all background processes finish. wait
然後你可以像這樣執行它:
$ foo.sh terdon@123.4.5.6 FAILED terdon@127.1.0.0 OK