我有一个正在运行的 amazon ec2 linux 实例,与一个密钥对 (p1) 相关联,并且我已将私钥下载到我的家用桌面。现在在工作中,我在工作桌面上创建了一个密钥对 (p2),并通过 AWS 控制台将公钥导入到 Amazon。
在家里,我想添加密钥对 p2 的公钥,以便将其添加到authorized_keys
我的 AMI 实例中(目前我只能从家里访问)。但是,我忘了带 p2 的公钥,因此能否以某种方式从 Amazon 导出此公钥。
答案1
很棒的谜题,谢谢!以下是其中一个答案:
启动一个新的临时 EBS 启动 t1.micro 实例 A,指定密钥对 p2。指定一个可用区域,其中您已有一个实例 B 在运行,并且您有权访问该实例。(如果需要,启动一个临时实例)。
在实例 A 处于运行状态几分钟后停止(而不是终止)它,这样它就有机会将公钥保存到其 authorized_keys 文件中。
从已停止的实例 A 分离根 EBS 卷。将其附加并安装到正在运行的实例 B。
从已挂载的文件系统中复制公钥。
分离并删除 EBS 卷。终止临时实例 A。
答案2
但是正确的 ssh-keygen 命令是:
ssh-keygen -y -f /path/to/privatekey > /path/to/publickey
答案3
我已经提供了一个使用 EBS 卷获取 ssh 公钥的答案,但这里有另一种方法可以获取它,即使用用户数据脚本启动临时 EC2 实例,该脚本将公钥发送到控制台输出。步骤如下:
将以下代码保存到output-ssh-key.userdata
本地计算机上命名的文件中。请勿在本地运行这些命令!
#!/bin/bash -ex
exec> >(tee /var/log/user-data.log|logger -t user -s 2>/dev/console) 2>&1
adminkey=$(GET instance-data/latest/meta-data/public-keys/ |
perl -ne 'print $1 if /^0=[^a-z0-9]*([-.@\w]*)/i')
cat <<EOF
SSHKEY:========================================================================
SSHKEY:HERE IS YOUR PUBLIC SSH KEY FOR KEYPAIR "$adminkey":
SSHKEY:$(cat /home/ubuntu/.ssh/authorized_keys)
SSHKEY:========================================================================
SSHKEY:Halting in 50min ($(date --date='+50 minutes' +"%Y-%m-%d %H:%M UTC"))
EOF
sleep 3000
halt
使用上述文件作为用户数据脚本运行现有的 Ubuntu 10.04 LTS 实例。指定要检索公共 ssh 密钥的密钥对:
ec2-run-instances \
--key YOURKEYPAIRHERE \
--instance-type t1.micro \
--instance-initiated-shutdown-behavior terminate \
--user-data-file output-ssh-key.userdata \
ami-ab36fbc2
继续从实例请求控制台输出,直到它显示您的公共 ssh 密钥。指定从 run-instances 命令返回的实例 ID:
ec2-get-console-output YOURINSTANCEID | grep SSHKEY: | cut -f3- -d:
在 2-10 分钟内你将获得如下输出:
========================================================================
HERE IS YOUR PUBLIC SSH KEY FOR KEYPAIR "erich":
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6rn8cl41CkzaH4ZBhczOJZaR4xBBDI1Kelc2ivzVvCB
THcdJRWpDd5I5hY5W9qke9Tm4fH3KaUVndlcP0ORGvS3PAL4lTpkS4D4goMEFrwMO8BG0NoE8sf2U/7g
aUkdcrDC7jzKYdwleRCI3uibNXiSdeG6RotClAAp7pMflDVp5WjjECDZ+8Jzs2wasdTwQYPhiWSiNcfb
fS97QdtROf0AcoPWElZAgmabaDFBlvvzcqxQRjNp/zbpkFHZBSKp+Sm4+WsRuLu6TDe9lb2Ps0xvBp1F
THlJRUVKP2yeZbVioKnOsXcjLfoJ9TEL7EMnPYinBMIE3kAYw3FzZZFeX3Q== erich
========================================================================
Halting in 50min (2011-12-20 05:58 UTC)
临时实例将在一小时内自动终止,但如果您想确保运行费用不超过两美分,您可以自行终止它。
答案4
另一个选择是在 user_data 中添加一个简短的脚本,只需向 root 添加另一个 ssh 密钥:
#!/bin/bash
touch ~/.ssh/authorized_keys
chmod 400 ~/.ssh/authorized_keys
echo "<KEY>" >> ~/.ssh/authorized_keys
然后,您可以以 root 身份登录到机器,ssh -l root -i <KEYFILE> URL
并从用户 ec2_user、ubuntu 或任何其他用户的 authorized_keys 中读取密钥。
唯一的事情是——您需要使机器可公开访问,并确保可以从外部访问端口 22。