[MacOS 10.12.6 主机,Ubuntu 14.04 LTS 客户机]
我有一个本地虚拟机设置,只接受公钥身份验证。到目前为止,我一直在使用需要输入密码的密钥,这种安排工作得很好。但是,我现在需要设置一个脚本来自动为我执行 scp。
由于我既不想让脚本暂停以让我提供密码,也不想expect
自动执行此操作,因此我决定使用没有密码的第二个密钥。
在我看来,它ssh-copy-id
无法处理这种情况,因为它使用参数-i
来告诉它要上传哪个密钥,因此我无法指定使用哪个密钥登录。
所以,我的问题是,如何接受ssh-copy-id
用于登录的第二个密钥?我应该使用吗ssh-add
?
(鉴于我上述遇到的问题ssh-copy-id
,我已手动复制密钥并将其添加到我的authorized_keys文件中。)
答案1
ssh-copy-id
将密钥附加到远程authorized_keys
文件。要添加多个特定密钥,请使用 为每个密钥运行一次-I <key-file-name>
。
更新
看了您的评论后,我觉得我理解错您的问题了。
您想使用一个密钥进行身份验证,同时在服务器上安装另一个密钥。
ssh-copy-id
在执行时不提供命令行选项来选择用于身份验证的密钥ssh-copy-id
。
但是它会传递-o
到ssh
。所以:
ssh-copy-id -i ~/.ssh/<your-new-id-to-install> -o 'IdentityFile ~/.ssh/<your-already-existing-id>' <servername>
您还可以使用,在这种情况下,只要正在运行,您在使用、、、aso时就ssh-agent
无需输入密码。ssh
scp
ssh-copy-id
ssh-agent
答案2
我添加了相同的问题,以便分享我的成功故事,这比@sborsky 的答案有所改进。您不需要 ssh-agent 或复杂的技巧。
执行建议的命令时,我得到以下信息:
/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
(if you think this is a mistake, you may want to use -f option)
确实如此,这是 ssh-copy 的一个错误。只需使用开关-f
即可:
ssh-copy-id -f -i ~/.ssh/id_rsa.pub -o 'IdentityFile ~/ssh-private-key.key' [email protected]
您将会看到(除其他内容外)重要的一行:Number of key(s) added: 1
现在您将能够使用基于密钥的 SSH 身份验证进行连接:ssh [email protected]
答案3
使用ssh-add
将密钥添加到代理绝对是一种选择。
否则,我相信您必须在.ssh/配置文件包含一个 IdentityFile 选项,它将告诉 ssh 如何对该服务器进行身份验证,并允许 ssh-copy-id 执行其操作。
答案4
我亲自动手了。完全手动完成。现在,目标是在远程主目录中创建 .pub 密钥并将其附加到那里的 authorized_keys 文件中。以下是详细信息:
# Variable definitions
identity_file=<already authorised key that you want to use for authorising>
ssh_keyfile_path=<new key path. we will add .pub below>
# Copy the public key into the remote server's authorized_keys
# file using the ssh-copy-id command. Note: This doesn't check
# if the key already existing.
echo " Copying public key (temporarily) to the remote host.."
scp -i ${identity_file} ${ssh_keyfile_path}.pub ${ssh_remote_user}@${ssh_remote_ip}:~
# We use basename to get the remote filename ($remote_key_pub)
echo " Appending to the authorized_keys"
remote_key_pub=`basename ~/${ssh_keyfile_path}.pub`
ssh ${ssh_remote_user}@${ssh_remote_ip} "cat ${remote_key_pub} >> ~/.ssh/authorized_keys"
echo " Removing the (temporary) public key"
ssh ${ssh_remote_user}@${ssh_remote_ip} "rm ~/${remote_key_pub}"
希望这可以帮助。