- 启动并配置代理 (
ssh-agent) - 将私钥添加到代理 (
ssh-add) - 使用代理进行连接 (
ssh,scp,sftp等)
启动并配置代理 (ssh-agent)
ssh-agent 是一个守护进程,它在后台运行,并持有你的已解密私钥,你的终端会话需要知道如何与这个代理通信。

在现代系统上(macOS, Linux)
现代的桌面环境(如 macOS, GNOME, KDE)通常会在你登录时自动启动 ssh-agent,并设置好必要的环境变量(SSH_AUTH_SOCK 和 SSH_AGENT_PID),你可以通过以下命令检查代理是否正在运行:
# 检查环境变量是否已设置 echo $SSH_AUTH_SOCK # 输出示例:/tmp/ssh-XXXXXXa3b4c5/agent.12345 echo $SSH_AGENT_PID # 输出示例:67890 # 或者使用 ssh-agent 自带的命令检查 ssh-add -l # 如果代理正在运行且没有添加密钥,会输出:The agent has no identities.
如果代理没有运行,你需要手动启动它:
# 启动 ssh-agent 并将环境变量加载到当前 shell eval "$(ssh-agent -s)"
重要提示: eval "$(ssh-agent -s)" 这条命令会输出 SSH_AUTH_SOCK 和 SSH_AGENT_PID 等环境变量,并用 eval 命令来执行它们,从而让当前的 shell 会话知道如何连接到新启动的代理进程。
在 Windows 上 (使用 WSL 或 Git Bash)
- 在 WSL (Windows Subsystem for Linux) 中: 和 Linux 一样,通常自动启动,如果没有,使用
eval "$(ssh-agent -s)"。 - 在 Git Bash 中: Git Bash 通常会自动处理
ssh-agent,你无需手动启动。
将私钥添加到代理 (ssh-add)
一旦代理运行,你需要将你的 SSH 私钥“添加”到代理中,这样,代理就可以在你需要时提供它,而无需你反复输入密码。

基本用法
# 添加默认的 ~/.ssh/id_rsa 私钥 ssh-add # 添加指定路径的私钥 ssh-add ~/.ssh/id_ed25519 # 添加一个有密码(passphrase)保护的私钥 # 系统会提示你输入一次密码,之后代理会记住它 ssh-add ~/.ssh/my_custom_key
常用 ssh-add 命令
| 命令 | 描述 |
|---|---|
ssh-add |
添加 ~/.ssh/id_rsa、~/.ssh/id_ecdsa、~/.ssh/id_ed25519 等默认私钥。 |
ssh-add /path/to/key |
添加指定路径的私钥。 |
ssh-add -l |
(list) 列出当前代理中所有已添加的私钥的“指纹”(fingerprints)。 |
ssh-add -L |
(list public keys) 列出当前代理中所有已添加的公钥。 |
ssh-add -d /path/to/key |
(delete) 从代理中删除指定的私钥。 |
ssh-add -D |
(delete all) 从代理中删除所有私钥。 |
示例流程:
- 第一次运行
ssh-add ~/.ssh/id_ed25519。 - 系统提示:
Enter passphrase for /home/user/.ssh/id_ed25519: - 你输入你的私钥密码。
- 之后,只要
ssh-agent在运行,你再使用这个密钥连接任何服务器,就无需再输入密码了。
使用代理进行连接
这是最神奇的一步,一旦私钥被添加到 ssh-agent,你所有的 SSH 客户端工具(ssh, scp, sftp, git 等)都会自动与代理通信,获取私钥来完成认证。
示例:ssh
# 正常连接,代理会自动提供私钥 ssh user@remote-server.com # 代理会依次尝试它缓存的所有私钥,直到成功为止
示例:scp
# 从远程服务器复制文件到本地,同样无需密码 scp user@remote-server.com:/path/to/remote/file.txt /path/to/local/
示例:git
# 使用 SSH 协式克隆或操作远程仓库 git clone git@github.com:user/repo.git # 后续的 git push, pull 等操作也无需密码
手动指定代理(高级用法)
通常你不需要这样做,因为环境变量已经设置好了,但在某些特殊情况下(如 ssh-agent 运行在非标准环境或不同用户下),你可以手动指定代理的 socket 文件:
# SSH_VERBOSE=2 可以看到 SSH 详细信息,包括它如何连接代理 SSH_VERBOSE=2 ssh -o "ProxyCommand=nc -X 5 -x /tmp/ssh-XXXXXXa3b4c5/agent.12345 %h %p" user@host # 这个命令比较复杂,通常只在调试或特殊网络配置时使用。 # 现代 SSH 会自动查找 $SSH_AUTH_SOCK。
完整工作流程示例
假设你有一台新的笔记本电脑,需要连接到你的云服务器。

-
生成 SSH 密钥(如果还没有)
ssh-keygen -t ed25519 -C "your_email@example.com" # 一路回车,它会生成在 ~/.ssh/id_ed25519
-
启动 SSH 代理
# 检查是否已启动 ssh-add -l # 如果没有输出,则启动 eval "$(ssh-agent -s)"
-
将私钥添加到代理
ssh-add # 提示输入 passphrase (如果设置了的话),输入一次即可。 # 输出:Identity added: /home/user/.ssh/id_ed25519 (your_email@example.com)
-
将公钥复制到远程服务器
ssh-copy-id user@your-server-ip # 这个命令会自动将 ~/.ssh/id_ed25519.pub 的内容追加到服务器的 ~/.ssh/authorized_keys 文件中。 # 它会提示你输入服务器的用户密码来完成此操作。
-
享受无密码登录!
# 从现在起,每次连接都无需密码 ssh user@your-server-ip
总结与最佳实践
ssh-agent是什么? 一个私钥缓存管家,避免你反复输入密码。ssh-add是什么? 将你的私钥交给ssh-agent保管。ssh等工具如何工作? 它们会自动向ssh-agent索要私钥来完成认证。- 安全性: 即使启用了 SSH 代理,你的私钥本身仍然受密码保护,如果有人物理上访问了你的电脑并获得了你的用户密码,他们也无法使用你的私钥(除非你设置了空的 passphrase)。强烈建议为你的私钥设置一个强密码(passphrase)。
- 会话持久性:
ssh-agent通常只在你当前的终端会话期间有效,当你关闭终端时,代理进程也会结束(除非你使用ssh-agent -D让它持续在前台运行),每次打开新终端时,如果桌面环境没有自动启动,你可能需要再次运行eval "$(ssh-agent -s)",很多现代系统(如 macOS)已经将ssh-agent的生命周期与你的登录会话绑定,无需手动处理。
