Linux

bash + 如何將 ssh 測試作為程序執行

  • March 17, 2021

在我的 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-subshel​​l”部分是否成功,而不是“在子 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

引用自:https://unix.stackexchange.com/questions/639699