bash + 如何执行 ssh 测试作为进程

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 机器,使用 & 会更快

答案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/subshel​​ls.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 ) &

相关内容