前言
同事误操作删除了一台AWS EC2 Linux实例ec2-user
用户目录下的.ssh/authorized_keys
文件,导致无法使用SSH登录,于是就有了此篇重新配置SSH连接密钥的记录。该方法需要有AWS EC2控制台中对应操作的权限,适用于本地连接私钥丢失或远程服务器保存的密钥丢失的情况。
解决方法
首先,需要登录到AWS EC2控制台页面,按以下步骤生成新的密钥对并将实例的根设备卷附加到一个临时实例上。
-
在EC2控制台的
Network & Security
页面创建新的密钥对。若是服务器丢失authorized_keys
而非本地丢失密钥文件,可以不生成新的密钥对,也可生成新的密钥对使用。 -
找到对应EC2实例
Storage
(存储)选项卡中Root device name
(根设备名称),记录设备名称(例如/dev/sda1
或/dev/xvda
)并在Block devices
下找到对应Volume ID
(卷ID)。 -
在EC2控制台中停止原始实例(
Stop instance
)。 -
创建一个新的临时实例,并选择在第一步中创建的密钥对作为连接的密钥对(若是服务器端密钥丢失,此处可使用原密钥对)。若在同一区域下有其它现存的实例可以使用,可以选择不创建新实例,在使用不同的密钥对的情况下,在第9步中操作将有所不同,不再需要复制实例中的密钥公钥,而是根据密钥私钥生成对应的公钥,生成方法可参考下文。
-
将原始实例的根设备卷从原始实例中分离(
Detach Volume
),在等待其状态变为available
后附加到临时实例上(Attach Volume
),并记下附加时设置的设备名称(例如/dev/xvdf
)。
执行完以上步骤后,需要通过SSH连接到临时实例上进行后续的操作:
-
通过
lsblk
命令确定卷是否已经分区,已分区的卷将带有part
类型的分区。如下面示例中的vxda
设备带有分区vxda1
,而vxdg
设备没有进行分区。若卷已分区,在下面的步骤中进行挂载时将需要挂载对应的分区(如分区/dev/xvdf1
),否则则需要挂载原始设备(如设备/dev/vxdg
)。$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202<