ElasticBeanstalk执行eb ssh报错:Host key verification failed
故障原因分析
老哥,这个坑我之前用Beanstalk自动伸缩时也踩过!核心问题其实出在本地SSH的known_hosts缓存:
- 你手动终止旧EC2实例后,Beanstalk自动伸缩组创建的新实例大概率复用了原来的公网IP(Beanstalk环境的EC2通常从子网IP池分配,或重新关联弹性IP)。
- SSH连接时会对比本地
known_hosts里存储的对应IP的主机密钥,发现和新实例的密钥不匹配,就会触发中间人攻击的安全警告,直接拒绝连接。 - 至于你试的
eb ssh --setup,这个命令只是配置Beanstalk环境和SSH密钥的关联(比如把公钥传到EC2的authorized_keys),根本不会处理本地known_hosts里的旧缓存,所以不管怎么重置密钥、执行setup,问题都会持续。
解决方法(按推荐程度排序)
方法一:手动清理known_hosts旧条目(最安全)
从报错里能看到,有问题的密钥在/Users/wai/.ssh/known_hosts的第35行,直接删掉这一行就行:
- 终端执行命令:
(Linux系统把sed -i '' '35d' /Users/wai/.ssh/known_hostssed -i ''改成sed -i即可) - 或者直接编辑文件:
找到对应IP的行删掉,按nano /Users/wai/.ssh/known_hostsCtrl+O保存、Ctrl+X退出。
之后再执行eb ssh,就会重新验证新实例的主机密钥并写入known_hosts,就能正常连接了。
方法二:临时跳过密钥检查(应急用)
如果不想手动编辑文件,可以在连接时临时关闭严格的主机密钥检查:
eb ssh --ssh-flag="-o StrictHostKeyChecking=no"
这个命令会让SSH跳过密钥验证,连接成功后新的主机密钥会自动写入known_hosts,下次连接就正常了。不过只适合应急用,别长期依赖,毕竟会降低安全性。
方法三:配置SSH自动忽略Beanstalk环境的密钥缓存(适合频繁换实例的开发环境)
如果你经常需要重启Beanstalk实例,可以修改SSH配置,让它针对Beanstalk环境自动跳过密钥检查:
- 编辑
~/.ssh/config文件(没有就创建一个):nano ~/.ssh/config - 添加以下内容(把
<你的Beanstalk环境域名>换成实际环境域名,或写EC2子网IP段比如10.0.0.*):Host *.<你的Beanstalk环境域名> 10.0.0.* StrictHostKeyChecking no UserKnownHostsFile /dev/null - 保存退出后,以后连接这个环境的EC2实例就不会再出现密钥不匹配的报错了。注意:这个方法会关闭该范围内主机的密钥验证,只适合开发环境,生产环境别用!
内容的提问来源于stack exchange,提问作者Wai Yan Hein
相关产品推荐
相关产品推荐

