Jus*_*s12 27 amazon-ec2 amazon-web-services
我有一个与密钥对 (p1) 关联的正在运行的 amazon ec2 linux 实例,我已将私钥下载到我的家庭桌面。现在在工作中,我在我的工作桌面上创建了一个密钥对 (p2),并通过 AWS 控制台将公钥导入到 Amazon。
在家里,我想添加要添加到authorized_keys我的 AMI 实例(我目前只能从家里访问)的密钥对 p2 的公钥。但是,我忘了带 p2 的公钥,所以有可能以某种方式从亚马逊导出这个公钥。
小智 39
然而,正确的 ssh-keygen 命令是:
ssh-keygen -y -f /path/to/privatekey > /path/to/publickey
Run Code Online (Sandbox Code Playgroud)
很好的拼图,谢谢!这是一个答案:
启动一个新的临时 EBS 启动 t1.micro 实例 A,指定密钥对 p2。指定一个可用区,您已经在其中运行了另一个实例 B 并且您可以访问该可用区。(如果需要,开始一个临时的)。
在实例 A 处于运行状态几分钟后停止(而不是终止)实例 A,因此它有机会将公钥保存到其 authorized_keys 文件中。
从停止的实例 A 中分离根 EBS 卷。将其附加并挂载到正在运行的实例 B。
从挂载的文件系统复制公钥。
分离并删除 EBS 卷。终止临时实例 A。
我已经提供了一个使用 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
Run Code Online (Sandbox Code Playgroud)
使用上述文件作为用户数据脚本运行一个股票 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
Run Code Online (Sandbox Code Playgroud)
继续请求实例的控制台输出,直到它显示您的公共 ssh 密钥。指定从 run-instances 命令返回的实例 ID:
ec2-get-console-output YOURINSTANCEID | grep SSHKEY: | cut -f3- -d:
Run Code Online (Sandbox Code Playgroud)
在 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)
Run Code Online (Sandbox Code Playgroud)
临时实例将在一小时内自动终止,但如果您想确保收取的费用不超过运行成本的 2 美分,您可以自行终止它。
如果您有私有 SSH 密钥,则只需运行以下ssh-keygen命令即可重新生成公共密钥组件:
ssh-keygen -i -f /path/to/private-key > /path/to/public-key
Run Code Online (Sandbox Code Playgroud)
这就是最简单的部分……AWS 控制台和 API 不支持在启动 EC2 实例时推送 2 个密钥对。这是留给系统管理员通过其他方式进行的练习。
如果您有权访问已授权的身份密钥,则只需执行以下ssh-copy-id命令:
ssh-copy-id -i /path/to/public-key user@EC2-instance
Run Code Online (Sandbox Code Playgroud)
这会将给定的公钥复制到服务器并~user/.ssh/authorized_keys自动为您复制到文件中,并确保对文件具有适当的权限。
更优雅的方法是在您的配置管理过程中包含额外的身份密钥。在我的情况下,这需要向节点的Puppet配置添加额外的键。
作为旁注,个人偏好但会使用更好的 SSH 密钥管理方法,而不是简单地为工作和家庭位置包含单独的密钥。正如我在上一个问题中提到的,我将密钥保存在随身携带的 USB 驱动器上,而不是保存在我使用的任何计算机上。
| 归档时间: |
|
| 查看次数: |
35953 次 |
| 最近记录: |