当服务器仅允许公钥认证时,如何使用 ssh-copy-id 第二个密钥

当服务器仅允许公钥认证时,如何使用 ssh-copy-id 第二个密钥

[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

但是它会传递-ossh。所以:

ssh-copy-id -i ~/.ssh/<your-new-id-to-install> -o 'IdentityFile ~/.ssh/<your-already-existing-id>' <servername>

您还可以使用,在这种情况下,只要正在运行,您在使用、、、aso时就ssh-agent无需输入密码。sshscpssh-copy-idssh-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}"

希望这可以帮助。

相关内容