3 步使用 ssh-keygen 和 ssh-copy-id 执行无密码 SSH 登录

如本文所述,我们可以使用 ssky-keygen 和 ssh-copy-id 通过 3 个简单的步骤登录到远程 Linux 服务器而无需输入密码。

ssh-keygen 创建公钥和私钥。 ssh-copy-id 将本地主机的公钥复制到远程主机的 authorized_keys 文件中。 ssh-copy-id 还为远程主机的 home、**/.ssh** 和 **/.ssh/authorized_keys** 分配了适当的权限。

本文还解释了使用 ssh-copy-id 的 3 个小烦恼以及如何将 ssh-copy-id 与 ssh-agent 一起使用。

第 1 步:在本地主机上使用 ssh-key-gen 创建公钥和私钥

火焰兔@zadmei.com-local$ [Note: You are on zadmei.com-local here]

火焰兔@zadmei.com-local$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/zadmei/.ssh/id_rsa):[Enter key]
Enter passphrase (empty for no passphrase): [Press enter key]
Enter same passphrase again: [Pess enter key]
Your identification has been saved in /home/zadmei/.ssh/id_rsa.
Your public key has been saved in /home/zadmei/.ssh/id_rsa.pub.
The key fingerprint is:
33:b3:fe:af:95:95:18:11:31:d5:de:96:2f:f2:35:f9 火焰兔@zadmei.com-local

第 2 步:使用 ssh-copy-id 将公钥复制到远程主机

火焰兔@zadmei.com-local$ ssh-copy-id -i ~/.ssh/id_rsa.pub zadmei.com-remote
火焰兔@zadmei.com-local's password:
Now try logging into the machine, with "ssh 'remote-host'", and check in:

.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

注意 :ssh-copy-id 将密钥附加到远程主机的 .ssh/authorized_key

第 3 步:不输入密码登录远程主机

火焰兔@zadmei.com-local$ ssh zadmei.com-remote
Last login: Sun Nov 16 17:22:33 2008 from 192.168.1.2
[Note: SSH did not ask for password.]

火焰兔@zadmei.com-remote$ [Note: You are on remote-host here]

在大多数情况下,以上 3 个简单的步骤应该可以完成工作。

我们之前还详细讨论了在不输入密码的情况下从 openSSH 到 openSSH 执行 SSH 和 SCP。

如果大家使用的是 SSH2,我们之前讨论过从 SSH2 到 SSH2 、从 OpenSSH 到 SSH2 以及从 SSH2 到 OpenSSH 执行 SSH 和 SCP 无需密码。

将 ssh-copy-id 与 ssh-add/ssh-agent 一起使用

如果没有为选项 -i 传递任何值并且如果 ~/.ssh/identity.pub 不可用,则 ssh-copy-id 将显示以下错误消息。

火焰兔@zadmei.com-local$ ssh-copy-id -i zadmei.com-remote
/usr/bin/ssh-copy-id: ERROR: No identities found

如果大家已使用 ssh-add 将密钥加载到 ssh-agent,则 ssh-copy-id 将从 ssh-agent 获取密钥以复制到远程主机。 即,当不将选项 -i 传递给 ssh-copy-id 时,它会将 ssh-add -L 命令提供的密钥复制到远程主机。

火焰兔@zadmei.com-local$ ssh-agent $SHELL

火焰兔@zadmei.com-local$ ssh-add -L
The agent has no identities.

火焰兔@zadmei.com-local$ ssh-add
Identity added: /home/zadmei/.ssh/id_rsa (/home/zadmei/.ssh/id_rsa)

火焰兔@zadmei.com-local$ ssh-add -L
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAsJIEILxftj8aSxMa3d8t6JvM79DyBV
aHrtPhTYpq7kIEMUNzApnyxsHpH1tQ/Ow== /home/zadmei/.ssh/id_rsa

火焰兔@zadmei.com-local$ ssh-copy-id -i zadmei.com-remote
火焰兔@zadmei.com-remote's password:
Now try logging into the machine, with "ssh 'zadmei.com-remote'", and check in:

.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.
[Note: This has added the key displayed by ssh-add -L]

ssh-copy-id 的三个小烦恼

以下是 ssh-copy-id 的一些小问题。

  • 默认公钥ssh-copy-id 使用 ~/.ssh/identity.pub 作为默认公钥文件(即当没有值传递给选项 -i 时)。相反,我希望它使用 id_dsa.pubid_rsa.pub 或 identity.pub 作为默认键。即如果其中任何一个存在,它应该将其复制到远程主机。如果存在两个或三个,则应默认复制 identity.pub
  • 代理没有身份:当 ssh-agent 正在运行并且 ssh-add -L 返回“The agent has no identities”(即没有向 ssh-agent 添加密钥)时,ssh-copy-id 仍将复制将消息“The agent has no identities”发送到远程主机的 authorized_keys 条目。
  • 授权密钥中的重复条目:我希望 ssh-copy-id 验证远程主机的授权密钥上的重复条目。如果在本地主机上多次执行 ssh-copy-id,它将继续在远程主机的 authorized_keys 文件上附加相同的密钥,而不检查重复项。即使有重复的条目,一切都按预期工作。但是,我想让我的 authorized_keys 文件杂乱无章。