Answers:
好拼图,谢谢!这是一个答案:
启动新的临时EBS引导t1.micro实例A,并指定密钥对p2。指定一个可用区,您已经在该可用区上运行了另一个实例B,并且您可以访问该实例。(如果需要,启动一个临时的)。
在实例A处于运行状态几分钟后停止(不终止)实例A,因此它有机会将公钥保存到其authorized_keys文件中。
从停止的实例A分离根EBS卷。将其附加并安装到正在运行的实例B。
从已挂载的文件系统中复制公钥。
卸下并删除EBS卷。终止临时实例A。
正确的ssh-keygen命令是:
ssh-keygen -y -f /path/to/privatekey > /path/to/publickey
chmod 400 your_private_key.pem
,如果你得到“权限过于开放的错误”
我已经提供了一个使用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)
临时实例会在一个小时内自动终止,但是如果您想确保自己收取的费用不超过运行所需的2美分,则可以自行终止。
如果您拥有私密SSH密钥,则只需运行以下ssh-keygen命令即可重新生成公钥组件:
ssh-keygen -i -f /path/to/private-key > /path/to/public-key
那就是最简单的部分...启动EC2实例时,AWS控制台和API不支持推送2个密钥对。这是系统管理员可以通过其他方式进行的练习。
如果您有权访问已授权的身份密钥,则只需执行以下ssh-copy-id命令:
ssh-copy-id -i /path/to/public-key user@EC2-instance
这会将给定的公钥~user/.ssh/authorized_keys
自动复制到服务器并复制到文件中,并确保对该文件具有适当的权限。
更为优雅的方法是在配置管理过程中包括其他身份密钥。在我的情况下,这需要将其他密钥添加到该节点的Puppet配置中。
附带说明一下,个人喜好但会使用更好的SSH密钥管理方法,而不仅仅是必须为工作和家庭位置添加单独的密钥。正如我在上一个问题中提到的那样,我将密钥保存在随身携带的USB驱动器上,而不是使用的任何计算机上。
另一个选择是在user_data中添加一个短脚本,该脚本仅向根添加另一个ssh密钥:
#!/bin/bash
touch ~/.ssh/authorized_keys
chmod 400 ~/.ssh/authorized_keys
echo "<KEY>" >> ~/.ssh/authorized_keys
然后,您可以使用root用户身份以root ssh -l root -i <KEYFILE> URL
用户身份登录计算机,并仅从用户ec2_user,ubuntu或无论如何被调用的authorized_keys中读出密钥。
唯一的事情-您需要使机器可公开访问,并确保可以从外部访问端口22。