如果丢失由 EBS 支持的实例的私有密钥,您可以重新获取对您的实例的访问权限。您必须停止实例,分离卷并将其作为数据卷附加到另一个实例,然后使用新的公有密钥修改 authorized_keys
文件,将卷移回原始实例,并重启实例。有关启动、连接和停止实例的更多信息,请参阅 实例生命周期。
此过程仅支持具有 EBS 根卷的实例。如果根设备是实例存储卷,则无法使用此过程重新获得对实例的访问权限;您必须拥有私有密钥才能连接到实例。要确定实例的根设备类型,请打开 Amazon EC2 控制台,选择实例,选择相应实例,然后选择存储选项卡,检查根设备详细信息部分中的根设备类型的值。
该值为 EBS
或 INSTANCE-STORE
。
如果丢失私有密钥,除以下步骤外,还有其他方法可以连接到 Linux 实例。有关更多信息,请参阅如果我在 SSH 密钥对初始启动后丢失,该如何连接到 Amazon EC2 实例?
使用不同的密钥对连接由 EBS 支持的实例的步骤
- 步骤 1:创建新的密钥对
- 步骤 2:获取有关原始实例及其根卷的信息
- 步骤 3:停止原始实例
- 步骤 4:启动临时实例
- 步骤 5:从原始实例中分离根卷并将其附加到临时实例
- 步骤 6:将新的公钥添加到已安装到临时实例的原始卷上的 authorized_keys
- 步骤 7:从临时实例中卸载并分离原始卷,然后将其重新附加到原始实例
- 步骤 8:使用新密钥对连接到原始实例
- 步骤 9:清除
步骤 1:创建新的密钥对
使用 Amazon EC2 控制台或第三方工具创建新的密钥对。如果您要将新密钥对的名称设置为与丢失的私有密钥相同的名称,则必须先删除现有密钥对。有关创建新密钥对的信息,请参阅使用 Amazon EC2 创建密钥对或使用第三方工具创建密钥对,并将公有密钥导入 Amazon EC2。
步骤 2:获取有关原始实例及其根卷的信息
请记下以下信息,因为您需要它来完成此过程。
获取有关原始实例的信息
-
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/。
-
在导航窗格中选择 Instances (实例),然后选择要连接到的实例。(我们将此称为原始实例。)
-
在 Details(详细信息)选项卡上,记下实例 ID 和 AMI ID。
-
在 Networking(网络)选项卡上,记下可用区。
-
在 Storage(存储)选项卡的 Root device name(根设备名称)下,记下根卷的设备名称(例如
/dev/xvda
)。然后,在 Block devices(块存储设备)下,查找此设备的名称并记下卷 ID(例如 vol-0a1234b5678c910de)。
步骤 3:停止原始实例
依次选择实例状态、停止实例。如果此选项处于禁用状态,则表示实例已停止,或者其根设备是实例存储卷。
警告
当您停止某个实例时,任何实例存储卷上的数据都将被擦除。要保留实例存储卷中的数据,请确保将其备份到持久性存储中。
步骤 4:启动临时实例
- New console
- Old console
启动临时实例
-
在导航窗格中,选择 Instances(实例),然后选择 Launch instances(启动实例)。
-
在 Name and tags(名称和标签)部分,对于 Name(名称),输入 Temporary(临时)。
-
在 Application and OS Images(应用程序和操作系统映像)部分中,选择您启动原始实例时所用的 AMI。如果此 AMI 不可用,您可以创建一个可在已停止的实例中使用的 AMI。有关更多信息,请参阅 创建一个由 Amazon EBS 支持的 Linux AMI 。
-
在 Instance type(实例类型)部分中,保留默认的实例类型。
-
在 Key pair(密钥对)部分中,对于 Key pair name(密钥对名称),选择现有密钥对进行使用或创建新密钥对。
-
在 Network settings(网络设置)部分,选择 Edit(编辑),然后为 Subnet(子网),选择与原始实例位于同一可用区的子网。
-
在 Summary(摘要)面板中,选择 Launch(启动)。
步骤 5:从原始实例中分离根卷并将其附加到临时实例
-
在导航窗格中,选择 Volumes(卷),并选择原始实例的根设备卷(您已在上一步骤中记下它的卷 ID)。依次选择 Actions(操作)、Detach Volume(分离卷),然后选择 Detach(分离)。等待卷的状态变为
available
。(您可能需要选择 Refresh (刷新) 图标。) -
如果卷仍保持选中状态,则选择 Actions(操作),然后选择 Attach Volume(附加卷)。选择临时实例的实例 ID,记下在 Device name(设备名称)下指定的设备名称(例如
/dev/sdf
),然后选择 Attach volume(附加卷)。注意
如果已从 Amazon Web Services Marketplace AMI 启动原始实例,并且卷包含 Amazon Web Services Marketplace 代码,则必须先停止临时实例,然后才能附加卷。
步骤 6:将新的公钥添加到已安装到临时实例的原始卷上的 authorized_keys
-
连接到临时实例。
-
在临时实例中,挂载附加到实例的卷以访问其文件系统。例如,如果设备名称为
/dev/sdf
,请使用以下命令将卷挂载为/mnt/tempvol
。注意
您的实例上显示的设备名称可能不同。例如,作为
/dev/sdf
挂载的设备可能在实例上显示为/dev/xvdf
。某些版本的 Red Hat(或其变体,如 CentOS)甚至可能将尾部字母增加 4 个字符,其中/dev/sd
成为f
/dev/xvd
。k
-
使用 lsblk 命令确定卷是否已分区。
[ec2-user ~]$
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 8G 0 disk └─xvda1 202:1 0 8G 0 part / xvdf 202:80 0 101G 0 disk └─xvdf1 202:81 0 101G 0 part xvdg 202:96 0 30G 0 disk
在前一个示例中,
/dev/xvda
和/dev/xvdf
是分区卷,而/dev/xvdg
不是。如果您的卷已分区,则应在后续步骤中挂载分区 (/dev/xvdf1)
),而不是原始设备 (/dev/xvdf
)。 -
创建临时目录以挂载卷。
[ec2-user ~]$
sudo mkdir /mnt/tempvol
-
使用之前确定的卷名称或设备名称在临时挂载点挂载卷(或分区)。所需命令取决于操作系统的文件系统。请注意,您的实例上显示的设备名称可能不同。有关更多信息,请参阅步骤 6 中的 note。
-
Amazon Linux、Ubuntu 和 Debian
[ec2-user ~]$
sudo mount /dev/
xvdf1
/mnt/tempvol -
Amazon Linux 2、CentOS、SUSE Linux 12 和 RHEL 7.x
[ec2-user ~]$
sudo mount -o nouuid /dev/
xvdf1
/mnt/tempvol
-
注意
如果您收到说明文件系统受损的错误,请运行以下命令以使用 fsck 实用程序检查文件系统并修复任何问题:
[ec2-user ~]$
sudo fsck /dev/
xvdf1
-
-
在临时实例中,借助临时实例
authorized_keys
中的新公有密钥,在已挂载卷上使用以下命令更新authorized_keys
。重要
以下示例使用 Amazon Linux 用户名
ec2-user
。您可能需要使用其他用户名来替换,例如对于 Ubuntu 实例为ubuntu
。[ec2-user ~]$
cp .ssh/authorized_keys /mnt/tempvol/home/
ec2-user
/.ssh/authorized_keys如果复制成功,则可以转到下一步骤。
(可选)如果您没有权限编辑
/mnt/tempvol
中的文件,您必须使用 sudo 更新文件,然后检查文件的权限,以验证您是否能够登录原始实例。请使用以下命令检查文件权限。[ec2-user ~]$
sudo ls -l /mnt/tempvol/home/ec2-user/.ssh
total 4 -rw------- 1
222 500
398 Sep 13 22:54 authorized_keys在这个输出示例中,
222
是用户 ID;500
是组 ID。接下来,请使用 sudo 重新运行失败的复制命令。[ec2-user ~]$
sudo cp .ssh/authorized_keys /mnt/tempvol/home/
ec2-user
/.ssh/authorized_keys再次运行以下命令以确定权限是否已更改。
[ec2-user ~]$
sudo ls -l /mnt/tempvol/home/
ec2-user
/.ssh如果用户 ID 和组 ID 已经更改,请使用以下命令进行恢复。
[ec2-user ~]$
sudo chown
222:500
/mnt/tempvol/home/ec2-user
/.ssh/authorized_keys
步骤 7:从临时实例中卸载并分离原始卷,然后将其重新附加到原始实例
-
在临时实例中,卸载已附加的卷,以将其重新附加到原始实例。例如,使用以下命令卸载
/mnt/tempvol
处的卷。[ec2-user ~]$
sudo umount /mnt/tempvol
-
从临时实例中分离卷(您在上一步中卸载了该卷):从 Amazon EC2 控制台,在导航窗格中选择 Volumes(卷),为原始实例选择根设备卷(您在上一步中记下了卷 ID),依次选择 Actions(操作)、Detach volume(分离卷),然后选择 Detach(分离)。等待卷的状态变为
available
。(您可能需要选择 Refresh (刷新) 图标。) -
将卷重新附加到原始实例:在卷仍保持选中状态时,选择 Actions(操作),然后选择 Attach Volume(附加卷)。选择原始实例的实例 ID,请指定您以前在步骤 2 中记下的原始根设备附加的设备名称(
/dev/sda1
或/dev/xvda
),然后选择 Attach volume(附加卷)。重要
如果您不指定与原始附加相同的设备名称,则无法启动原始实例。Amazon EC2 要求根设备卷位于
sda1
或者/dev/xvda
。
步骤 8:使用新密钥对连接到原始实例
选择原始实例,然后依次选择实例状态、启动实例。在实例进入 running
状态后,您可以使用新密钥对的私有密钥文件连接到该实例。
注意
如果您的新密钥对和相应私有密钥文件的名称不同于原始密钥对的名称,请确保在连接到实例时指定新私有密钥文件的名称。
步骤 9:清除
(可选) 如果您将不再使用临时实例,可以将其终止。选择临时实例,然后依次选择 Instance State(实例状态)和 Terminate instance(终止实例)。