使用 ssh-agent 管理 SSH 密钥
在本实验步骤中,你将学习如何使用 ssh-agent 管理你的 SSH 密钥。ssh-agent 是一款在后台运行的程序,它将你的私钥保存在内存中。当你的私钥受密码保护时,这尤其有用。你无需每次使用密钥时都输入密码,只需在将密钥添加到 ssh-agent 时输入一次密码,然后代理程序会在你的会话期间为你处理身份验证。
虽然你在之前的步骤中生成了一个没有密码的密钥,但现在我们将创建一个带密码的新密钥,以演示 ssh-agent 的实用性。
首先,生成一个带密码的新 SSH 密钥对。我们将这个密钥命名为 id_rsa_passphrase,以便将其与默认的 id_rsa 密钥区分开来。
ssh-keygen -f ~/.ssh/id_rsa_passphrase
系统将提示你输入密码。在本实验中,使用 mypassphrase 作为密码。
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): mypassphrase
Enter same passphrase again: mypassphrase
Your identification has been saved in /home/labex/.ssh/id_rsa_passphrase
Your public key has been saved in /home/labex/.ssh/id_rsa_passphrase.pub
The key fingerprint is:
SHA256:BuSxVlJb1lsiUFi2I5DAvyL01fJ5d480LT86dgtcHEg labex@6846375f1c0e35fea6cb03e6
The key's randomart image is:
+---[RSA 3072]----+
| ...=o+=*. E |
| .o.*.=..+ o |
| .=.o o. = . |
| . .+... .. . .|
| . . . +S. + |
| . o ..o . o * .|
| . . . . = * |
| oooo|
| ..+.o|
+----[SHA256]-----+
注意: 如果不小心在输入密码时按下了 Enter 键,则密钥将不会被设置密码。在这种情况下,你可以删除文件并再次运行命令,确保在提示时输入 mypassphrase。
现在,让我们将这个新公钥复制到 localhost,以便你能够使用它进行身份验证。
ssh-copy-id -i ~/.ssh/id_rsa_passphrase.pub labex@localhost
由于你已经使用默认密钥设置了无密码身份验证,因此命令可能不会提示输入密码,并将使用你现有的身份验证:
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/labex/.ssh/id_rsa_passphrase.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'labex@localhost'"
and check to make sure that only the key(s) you wanted were added.
现在,尝试使用此新密钥连接到 localhost。你需要使用 -i 选项指定私钥文件。
ssh -i ~/.ssh/id_rsa_passphrase labex@localhost
如果你为密钥设置了密码,系统将提示你输入密码。但是,如果你不小心创建了没有密码的密钥(如示例输出所示),你将直接登录:
Last login: Mon Jun 9 01:39:25 2025 from 47.251.66.143
[labex@host ~]$
你已登录。现在,退出会话:
exit
exit
Connection to localhost closed.
[labex@host ~]$
注意: 即使你的密钥没有密码,你仍然可以使用 ssh-agent 演示来理解它的工作原理,即使在这种情况下它不会提示输入密码。
首先,在当前 shell 会话中启动 ssh-agent。eval 命令用于正确设置 ssh-agent 输出的环境变量。
eval "$(ssh-agent)"
Agent pid 1024
输出将显示 ssh-agent 的进程 ID (PID)。
接下来,将你的私钥 (id_rsa_passphrase) 添加到 ssh-agent。
ssh-add ~/.ssh/id_rsa_passphrase
如果你的密钥有密码,系统将提示你输入密码。如果没有,密钥将被直接添加:
Identity added: /home/labex/.ssh/id_rsa_passphrase (labex@6846375f1c0e35fea6cb03e6)
现在密钥已添加到 ssh-agent,再次尝试使用相同的密钥连接到 localhost。
ssh -i ~/.ssh/id_rsa_passphrase labex@localhost
你应该能够连接,而无需提示输入密码(无论你的密钥是否有密码,因为它现在由代理程序管理):
Last login: Mon Jun 9 01:39:49 2025 from 127.0.0.1
[labex@host ~]$
你已成功使用 ssh-agent 管理你的 SSH 密钥。
重要提示: ssh-agent 环境变量仅在启动它的 shell 会话中可用。如果在 SSH 会话中,你需要退出到本地 shell 才能使用 ssh-add 命令。
首先退出 SSH 会话:
exit
exit
Connection to localhost closed.
[labex@host ~]$
现在,要查看当前加载到你的 ssh-agent 中的密钥,可以使用 ssh-add -l:
ssh-add -l
如果代理程序正在运行并且已加载密钥,你将看到类似的输出:
3072 SHA256:BuSxVlJb1lsiUFi2I5DAvyL01fJ5d480LT86dgtcHEg /home/labex/.ssh/id_rsa_passphrase (RSA)
但是,如果你看到类似“无法连接到你的身份验证代理”的错误消息,则表示当前会话中未设置代理环境变量。
要从 ssh-agent 中删除所有身份,请使用 ssh-add -D:
ssh-add -D
如果代理程序可访问,你将看到:
All identities removed.
但是,如果你看到“无法连接到你的身份验证代理”的错误消息,则表示当前会话中没有代理环境。
现在,如果你再次尝试连接,并且你的密钥有密码,系统将提示你输入密码,因为密钥已从代理程序中删除:
ssh -i ~/.ssh/id_rsa_passphrase labex@localhost
如果你的密钥有密码,你将看到:
Enter passphrase for key '/home/labex/.ssh/id_rsa_passphrase':
如果你的密钥没有密码,你仍然可以进行直接连接。如果提示输入密码,请按 Ctrl+C 取消连接尝试。
最后,要停止 ssh-agent 进程,可以使用 ssh-agent -k:
ssh-agent -k
如果未设置 SSH_AGENT_PID 环境变量,你可能会看到:
SSH_AGENT_PID not set, cannot kill agent
如果代理程序是在不同的 shell 会话中启动的,或者环境变量未正确导出,则这是正常的。