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

如何通过bash脚本检测EC2实例是否已准备好接受SSH连接

EC2 SSH就绪检测实现方案

你可以在原有的实例运行状态检测逻辑后新增SSH连通性校验环节,即可解决实例running但SSH未就绪的问题,具体实现如下:

完整修改后的脚本逻辑

# 原有实例运行状态检测逻辑
while [ "$ec2_instance_status" != '"running"' ]; do
    echo "=======instance state - $ec2_instance_status======="
    sleep 10
    ec2_instance_status=$(aws --region=ap-southeast-2 --profile=prod ec2 describe-instance-status --instance-ids $instance_id | jq ".InstanceStatuses[0].InstanceState.Name")
done

# 新增步骤1:获取EC2实例的公网IP(如果用内网连接替换为PrivateIpAddress即可)
ec2_public_ip=$(aws --region=ap-southeast-2 --profile=prod ec2 describe-instances --instance-ids $instance_id | jq -r ".Reservations[0].Instances[0].PublicIpAddress")

# 新增步骤2:SSH就绪检测,设置最大重试次数避免无限等待
max_retry=15
retry_count=0
ssh_ready=0
ssh_user="你的EC2登录用户名" # 比如ec2-user、ubuntu等

while [ $retry_count -lt $max_retry ]; do
    # 检测方式1:用nc检测22端口是否开放,轻量无需认证
    if nc -z -w 5 $ec2_public_ip 22; then
        ssh_ready=1
        break
    fi

    # 可选检测方式2:直接用SSH做空命令探测,验证SSH服务可正常响应认证,更准确
    # if ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no $ssh_user@$ec2_public_ip 'exit 0' > /dev/null 2>&1; then
    #     ssh_ready=1
    #     break
    # fi

    echo "=======SSH not ready, retry $((retry_count+1))/$max_retry======="
    sleep 10
    retry_count=$((retry_count+1))
done

if [ $ssh_ready -eq 0 ]; then
    echo "=======SSH connection failed after $max_retry retries, exit======="
    exit 1
fi

# 后续执行ansible等任务逻辑

关键说明

  • 两种检测方式按需选择:仅确认端口连通选nc方案,需要确认SSH服务完全可用选SSH探测方案
  • max_retry和等待时长可按需调整,上述配置默认最长等待2.5分钟,足够覆盖EC2初始化耗时
  • 运行脚本的机器需要提前安装nc或者ssh客户端,且EC2安全组已放通该机器的22端口入站权限

内容的提问来源于stack exchange,提问作者Harshit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:15:03