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

无法通过SSH连接AWS EC2实例,遇Permission denied(publickey)问题求助

解决AWS EC2 SSH Permission denied (publickey)的实用步骤

我完全懂这种突然连不上EC2的崩溃感——之前那次迁移数据的折腾肯定够头疼的,这次咱们尽量不用走那条路,一步步来排查:

先从本地端排查(最容易忽略的小问题)

  • 检查密钥文件权限:Linux/macOS系统对SSH密钥的权限要求很严,必须是600(只有自己能读写),不然SSH会直接拒绝。执行这个命令修正:
    chmod 600 DRUID_PROD_NEW.pem
    
    同时确认你用的pem文件是不是原来的那个,有没有误删、替换或者重命名错了。
  • 核对SSH命令的细节:
    • 用户名:不同EC2镜像的默认用户名不一样,Amazon Linux是ec2-user,Ubuntu是ubuntu,CentOS是centos——先确认你的实例是不是Amazon Linux系的,别用错用户名。
    • 主机地址:检查eX.X.X.x.compute-1.amazonaws.com是不是实例当前的公网域名/IP,如果实例是动态公网IP,重启后可能会变,去AWS控制台确认下最新的地址。
  • 清空SSH缓存的旧主机信息:有时候SSH会缓存旧的主机密钥,导致连接异常。可以临时跳过检查试试:
    ssh -i "DRUID_PROD_NEW.pem" -o StrictHostKeyChecking=no ec2-user@eX.X.X.x.compute-1.amazonaws.com
    
    或者手动删除~/.ssh/known_hosts里对应这个EC2主机的条目。

服务器端排查(用AWS控制台的实例连接先登进去)

如果本地没问题,先试试AWS控制台自带的EC2实例连接(浏览器直接登录,不用密钥),如果能登进去,就可以检查服务器端的配置:

  • 检查SSH服务配置:
    打开/etc/ssh/sshd_config文件,确认以下配置:
    PubkeyAuthentication yes
    AuthorizedKeysFile      .ssh/authorized_keys .ssh/authorized_keys2
    
    如果配置不对,修改后重启SSH服务:sudo systemctl restart sshd
  • 核对authorized_keys文件:
    先在本地生成pem对应的公钥:
    cat DRUID_PROD_NEW.pem | ssh-keygen -y
    
    然后在服务器上查看/home/ec2-user/.ssh/authorized_keys,确认里面的公钥和本地生成的完全一致。同时检查这个文件的权限必须是600,.ssh目录权限是700:
    sudo chmod 700 /home/ec2-user/.ssh
    sudo chmod 600 /home/ec2-user/.ssh/authorized_keys
    
  • 检查安全组和防火墙:
    • 去AWS控制台确认EC2实例的安全组有没有允许22端口的入站流量(来源是你的IP或者0.0.0.0/0,根据你的需求)。
    • 服务器本地防火墙:执行sudo iptables -L看看有没有禁止22端口的规则,或者用sudo systemctl status firewalld检查防火墙状态。
  • 检查实例状态:在AWS控制台看实例的状态检查,有没有失败的情况。如果是硬件故障导致的,尝试停止再启动实例(注意:如果是动态公网IP,停止会释放,最好先分配弹性IP再操作)。

终极方案:挂载EBS卷修复(不用迁移全量数据)

如果以上都不行,大概率是服务器的authorized_keys被意外修改了,这时候可以通过挂载EBS卷的方式修复:

  1. 停止出现问题的EC2实例。
  2. 在AWS控制台分离该实例的根EBS卷(注意记录卷的ID和原挂载点)。
  3. 启动一个临时的同区域、同系统的EC2实例(比如Amazon Linux 2)。
  4. 将分离的EBS卷挂载到临时实例上(控制台操作,挂载点选/dev/sdf之类的)。
  5. 在临时实例上挂载卷:
    sudo mkdir /mnt/recovery
    sudo mount /dev/xvdf1 /mnt/recovery  # 这里的设备名可能是xvdf或者xvdf1,根据实际情况调整
    
  6. 编辑/mnt/recovery/home/ec2-user/.ssh/authorized_keys,添加本地pem对应的公钥(就是之前用ssh-keygen -y生成的那个)。
  7. 卸载卷并分离:
    sudo umount /mnt/recovery
    
    然后在控制台把卷挂载回原来的EC2实例,启动实例,再尝试SSH连接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:50:18