Bash脚本中如何通过ssh返回值判断连接与登录是否成功
Bash脚本通过ssh返回值判断主机连通性方案
核心原理
ssh 命令执行完成后会返回标准的进程退出码,天然符合布尔判断需求:
- 退出码为
0:代表ssh连接、认证登录全部成功 - 退出码非
0:代表连接失败、认证失败、主机不可达等错误情况
你可以直接在if判断里调用ssh命令,通过退出码判断结果即可。
注意:原脚本存在的语法错误
你现有脚本里的变量赋值写法有问题,赋值时变量名前不能加$:
错误写法:
$deadhosts = 0、$counter = 0
正确写法:deadhosts=0、counter=0
修改后基于ssh检测的完整脚本
#!/bin/bash File="hosts.list" Hosts=$(cat $File) declare -i deadhosts deadhosts=0 declare -i counter counter=0 # 建议提前配置好ssh密钥免密登录,避免每次执行需要手动输入密码 for Host in $Hosts do # ssh参数说明: # -o ConnectTimeout=2 连接超时时间设为2秒,避免长时间卡住 # -o StrictHostKeyChecking=no 自动接受主机密钥,不会弹出确认提示 # -o BatchMode=yes 禁用交互式输入密码,遇到需要输密码的场景直接返回失败 # 最后的: 是占位空命令,ssh登录成功后执行空命令直接退出,不会对目标主机做任何修改 if ! ssh -o ConnectTimeout=2 -o StrictHostKeyChecking=no -o BatchMode=yes "$Host" : >/dev/null 2>&1; then deadhosts=$((deadhosts+1)) else echo $Host fi counter=$((counter+1)) done echo "Mission success" echo "Scanned Hosts: $counter Dead Hosts: $deadhosts"
可选调整说明
- 如果你没有配置免密登录,脚本会自动跳过需要输入密码的主机,判定为连接失败,符合批量检测的需求
- 你可以根据自己的网络环境调整
ConnectTimeout的超时时间,网络差的场景可以设为3或5秒 - 如果目标主机ssh端口不是默认22,添加
-p 端口号参数即可,比如ssh -p 2222 ...
内容的提问来源于stack exchange,提问作者Bchru
相关产品推荐
相关产品推荐

