You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:45:02