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

PuTTY连接EC2:为Ubuntu用户配置AWS密钥对失败原因咨询

问题:AWS EC2 Ubuntu实例通过user-data添加密钥对失败,ec2-user却可正常登录?

问题背景

  • 电脑故障丢失未备份的PuTTY .ppk文件,无法连接EC2实例,按AWS指引通过user-data添加新密钥对
  • 首次操作成功以ec2-user身份登录,但实例默认用户为ubuntu,因无密码无法通过su - ubuntu切换
  • 修改user-data指定name为ubuntu并重启后,PuTTY连接时报错Server refused our key
  • 测试指定name为rubbish无法登录,但仍能以ec2-user身份登录
  • 恢复原.ppk后可正常连接,疑惑为何user-data方法对ubuntu用户无效

原因分析

1. Ubuntu AMI与Amazon Linux的user-data处理逻辑差异

AWS官方文档中的密钥替换方法是针对Amazon Linux AMI设计的,而Ubuntu官方AMI使用cloud-init处理user-data,两者逻辑不同:

  • Amazon Linux会直接解析ssh-authorized-keys格式的user-data,为指定用户添加密钥
  • Ubuntu的cloud-init仅在实例首次启动时,为默认用户ubuntu初始化密钥;后续修改user-data时,需使用cloud-config的特定格式才能触发密钥更新,原文档的格式无法被Ubuntu的cloud-init正确识别处理。

2. ec2-user的密钥未被清理

首次添加user-data时,脚本为ec2-user添加了密钥,但user-data脚本默认只负责添加密钥,不会主动清理旧密钥。后续移除user-data并重启时,~ec2-user/.ssh/authorized_keys中的密钥依然存在,因此仍能登录。

3. Ubuntu用户目录权限问题

当你指定name为ubuntu时,cloud-init尝试修改~ubuntu/.ssh/authorized_keys,但如果该文件或父目录的权限不符合SSH要求(比如所有者非ubuntu、权限过于开放),SSH服务会拒绝使用该密钥,导致Server refused our key报错。而ec2-user的目录权限是首次操作时正确设置的,因此密钥可正常生效。

4. cloud-init的状态缓存

cloud-init会缓存已执行的user-data操作记录,避免重复执行。首次添加user-data后,即使后续修改并重新添加,cloud-init可能不会重新处理密钥添加逻辑,除非重置其缓存状态。


补充解决建议(供后续参考)

若需通过user-data为Ubuntu用户添加密钥,需使用cloud-config格式:

#cloud-config
ssh_authorized_keys:
  - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC... 你的新公钥内容

执行前需重置cloud-init缓存:

sudo rm -rf /var/lib/cloud/instance/*

之后重启实例即可生效。

内容的提问来源于stack exchange,提问作者Paul Taylor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:51:14