首次使用Capistrano部署Rails 5至EC2遭遇SSH认证错误求助
刚上手Capistrano部署确实容易踩SSH认证的坑,我帮你一步步排查解决这个问题:
第一步:先修正一个明显的拼写错误
你提到密钥存放在服务器的/home/deploy/.shh目录——这里是笔误,正确的目录应该是.ssh(两个s)。Capistrano默认会读取用户家目录下的.ssh文件夹,路径写错的话肯定找不到密钥文件,先确认服务器上的目录是否为正确的/home/deploy/.ssh。
第二步:先抛开Capistrano,测试基础SSH连通性
先直接用SSH命令验证本地能不能连上EC2服务器,这是排查的基础:
ssh deploy@你的EC2公网IP -i /本地私钥的完整路径
比如你的私钥在本地~/.ssh/ec2_deploy_key.pem,就运行:
ssh deploy@xxx.xxx.xxx.xxx -i ~/.ssh/ec2_deploy_key.pem
如果这一步连不上,先解决SSH本身的问题:
- 检查本地私钥权限:必须设为
600,运行chmod 600 ~/.ssh/ec2_deploy_key.pem - 检查EC2安全组:确保22端口(SSH端口)开放给你的本地IP
- 检查服务器端
/home/deploy/.ssh/authorized_keys:里面要包含本地私钥对应的公钥内容,且文件权限为600,.ssh文件夹权限为700
第三步:配置Capistrano的SSH参数
确保你的config/deploy/production.rb里正确配置了SSH相关选项:
server '你的EC2公网IP', user: 'deploy', roles: %w{app db web} set :ssh_options, { keys: %w(~/.ssh/ec2_deploy_key.pem), # 注意:这里是本地私钥的路径,不是服务器上的路径! forward_agent: true, auth_methods: %w(publickey) }
划重点:很多新手会搞混,Capistrano是从你的本地机器发起SSH连接到EC2,所以keys指向的是本地的私钥文件,不是服务器上的密钥路径。如果你的私钥设置了密码,记得提前用ssh-add ~/.ssh/ec2_deploy_key.pem把密钥加到SSH代理里,或者开启forward_agent参数。
第四步:获取完整错误日志定位问题
你给出的错误信息不全,想要精准排查,可以加上--trace参数运行部署命令,获取完整的错误堆栈:
cap production deploy --trace
这样能看到具体是SSH连接的哪一步失败——比如是找不到本地私钥、服务器拒绝公钥,还是用户权限不足。
第五步:检查服务器端的SSH配置
登录到EC2服务器,检查/etc/ssh/sshd_config的几个关键配置项:
PubkeyAuthentication yes:确保公钥认证功能开启AuthorizedKeysFile .ssh/authorized_keys:确认公钥文件的路径配置正确PasswordAuthentication no:如果已经用密钥认证,密码认证可以关闭(如果还没调试好,暂时开启方便测试)
修改后重启sshd服务:sudo systemctl restart sshd
内容的提问来源于stack exchange,提问作者mattC
相关产品推荐
相关产品推荐

