在我的 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 机器,使用 & 会更快
答案1
只需将测试移至一个函数中,以便您的脚本可以在后台运行它并并行测试多个连接:
#!/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
[email protected] FAILED
[email protected] OK
答案2
如果您关心结果,那么在某些时候,wait
当命令在后台/子 shell 中运行时,您必须关心结果(了解更多信息 TLDPhttps://tldp.org/LDP/abs/html/subshells.html)。
在示例中,检查的是“创建子 shell”部分是否成功,而不是“子 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 ) &