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

Bash脚本SSH连接AWS EC2实例失败问题及远程命令执行咨询

AWS EC2脚本SSH连接失败原因及远程命令执行方案

一、脚本中SSH连接被拒绝的原因及解决

原因分析

  • 实例初始化未完成:EC2实例启动后,系统需要时间完成内核加载、sshd服务启动,首次启动还会运行cloud-init初始化脚本(比如配置用户、安装基础组件)。脚本里启动实例后立刻执行SSH,此时sshd可能还没就绪,导致连接被拒;而手动操作时你会等待实例完全启动,所以能成功连接。
  • 公网IP未生效:AWS给实例分配公网IP后,需要几秒时间完成路由绑定。脚本刚通过AWS CLI获取IP就发起SSH请求,此时IP可能还没指向实例,导致连接失败。

解决方法

在脚本中添加等待逻辑,确保实例就绪后再执行SSH:

  1. 等待实例进入running状态:用AWS CLI的等待命令,确保实例状态正常:
    aws ec2 start-instances --instance-ids <INSTANCE-ID>
    aws ec2 wait instance-running --instance-ids <INSTANCE-ID>
    
  2. 额外等待sshd服务就绪:即使实例处于running状态,sshd可能还没启动,可循环检查22端口是否开放,或者直接等待固定时间(比如30秒,根据实例类型调整):
    # 等待30秒,给实例足够初始化时间
    sleep 30
    
    # 或者用nc命令循环检查端口(需要安装nc)
    INSTANCE_IP=$(aws ec2 describe-instances --instance-ids <INSTANCE-ID> --query 'Reservations[0].Instances[0].PublicIpAddress' --output text)
    until nc -z $INSTANCE_IP 22; do
      echo "等待SSH端口就绪..."
      sleep 5
    done
    
  3. 确认获取的公网IP正确:确保AWS CLI返回的IP是最新的,可在等待实例running后重新获取IP,避免拿到旧的或未绑定的IP。

二、SSH连接后执行远程命令的方法

单条或多条命令直接执行

在ssh命令后直接追加要执行的命令,用引号包裹:

# 执行sudo apt update和ls -al
ssh -i "your-key-pair.pem" ubuntu@$INSTANCE_IP "sudo apt update -y && ls -al"
  • 注意:如果命令包含特殊字符(比如管道、重定向),最好用单引号包裹,避免本地shell解析。
  • sudo命令建议配置免密(可通过cloud-init或修改/etc/sudoers实现),避免手动输入密码影响脚本自动化。

批量执行多条命令(Here-Doc方式)

如果要执行一系列复杂命令,可以用here-doc,把命令作为输入传给ssh:

ssh -i "your-key-pair.pem" ubuntu@$INSTANCE_IP << EOF
sudo apt update -y
sudo apt upgrade -y
ls -al /home/ubuntu
echo "远程命令执行完成"
EOF

这种方式适合多行命令的批量执行,逻辑更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:45:11