菜鸟科技网

SSH代理命令有哪些?

  1. 启动并配置代理 (ssh-agent)
  2. 将私钥添加到代理 (ssh-add)
  3. 使用代理进行连接 (ssh, scp, sftp 等)

启动并配置代理 (ssh-agent)

ssh-agent 是一个守护进程,它在后台运行,并持有你的已解密私钥,你的终端会话需要知道如何与这个代理通信。

SSH代理命令有哪些?-图1
(图片来源网络,侵删)

在现代系统上(macOS, Linux)

现代的桌面环境(如 macOS, GNOME, KDE)通常会在你登录时自动启动 ssh-agent,并设置好必要的环境变量(SSH_AUTH_SOCKSSH_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_SOCKSSH_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代理命令有哪些?-图2
(图片来源网络,侵删)

基本用法

# 添加默认的 ~/.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) 从代理中删除所有私钥。

示例流程:

  1. 第一次运行 ssh-add ~/.ssh/id_ed25519
  2. 系统提示:Enter passphrase for /home/user/.ssh/id_ed25519:
  3. 你输入你的私钥密码。
  4. 之后,只要 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代理命令有哪些?-图3
(图片来源网络,侵删)
  1. 生成 SSH 密钥(如果还没有)

    ssh-keygen -t ed25519 -C "your_email@example.com"
    # 一路回车,它会生成在 ~/.ssh/id_ed25519
  2. 启动 SSH 代理

    # 检查是否已启动
    ssh-add -l
    # 如果没有输出,则启动
    eval "$(ssh-agent -s)"
  3. 将私钥添加到代理

    ssh-add
    # 提示输入 passphrase (如果设置了的话),输入一次即可。
    # 输出:Identity added: /home/user/.ssh/id_ed25519 (your_email@example.com)
  4. 将公钥复制到远程服务器

    ssh-copy-id user@your-server-ip
    # 这个命令会自动将 ~/.ssh/id_ed25519.pub 的内容追加到服务器的 ~/.ssh/authorized_keys 文件中。
    # 它会提示你输入服务器的用户密码来完成此操作。
  5. 享受无密码登录!

    # 从现在起,每次连接都无需密码
    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 的生命周期与你的登录会话绑定,无需手动处理。
分享:
扫描分享到社交APP
上一篇
下一篇