Bash脚本SSH连接AWS EC2实例失败问题及远程命令执行咨询
AWS EC2脚本SSH连接失败原因及远程命令执行方案
一、脚本中SSH连接被拒绝的原因及解决
原因分析
- 实例初始化未完成:EC2实例启动后,系统需要时间完成内核加载、sshd服务启动,首次启动还会运行cloud-init初始化脚本(比如配置用户、安装基础组件)。脚本里启动实例后立刻执行SSH,此时sshd可能还没就绪,导致连接被拒;而手动操作时你会等待实例完全启动,所以能成功连接。
- 公网IP未生效:AWS给实例分配公网IP后,需要几秒时间完成路由绑定。脚本刚通过AWS CLI获取IP就发起SSH请求,此时IP可能还没指向实例,导致连接失败。
解决方法
在脚本中添加等待逻辑,确保实例就绪后再执行SSH:
- 等待实例进入running状态:用AWS CLI的等待命令,确保实例状态正常:
aws ec2 start-instances --instance-ids <INSTANCE-ID> aws ec2 wait instance-running --instance-ids <INSTANCE-ID> - 额外等待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 - 确认获取的公网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
相关产品推荐
相关产品推荐

