ssh-agent命令

ssh-agent 命令 #

ssh-agent是一个用于存储私钥的程序,它可以在用户登录会话期间保存解密的私钥,从而避免每次使用 SSH 密钥时都需要输入密码短语。这对于使用了密码保护的 SSH 密钥的用户特别有用。

语法 #

ssh-agent [选项] [命令 [参数...]]

常用选项 #

选项 描述
-a 套接字 绑定代理到指定的 Unix 域套接字
-c 生成 C-shell 风格的命令
-s 生成 Bourne shell 风格的命令(默认)
-d 调试模式
-k 终止当前代理
-t 生存时间 设置默认的密钥生存时间(秒)

常见用法 #

1. 启动 SSH 代理 #

eval $(ssh-agent)

这将启动ssh-agent并设置必要的环境变量(SSH_AUTH_SOCK 和 SSH_AGENT_PID)。

2. 添加密钥到代理 #

ssh-add

默认情况下,这将添加~/.ssh/id_rsa~/.ssh/id_dsa~/.ssh/id_ecdsa~/.ssh/id_ed25519~/.ssh/identity(如果存在)。

3. 添加特定的密钥 #

ssh-add ~/.ssh/id_ed25519

4. 添加密钥并设置生存时间 #

ssh-add -t 3600 ~/.ssh/id_rsa  # 1小时后过期

5. 列出代理中的密钥 #

ssh-add -l  # 列出指纹
ssh-add -L  # 列出完整公钥

6. 从代理中删除密钥 #

ssh-add -d ~/.ssh/id_rsa  # 删除特定密钥
ssh-add -D               # 删除所有密钥

7. 锁定和解锁代理 #

ssh-add -x  # 锁定代理(需要密码)
ssh-add -X  # 解锁代理(需要之前设置的密码)

8. 在特定环境中启动代理 #

ssh-agent bash  # 在新的bash shell中启动代理

9. 终止代理 #

ssh-agent -k

或者:

eval $(ssh-agent -k)

环境变量 #

ssh-agent使用以下环境变量:

  • SSH_AUTH_SOCK:指向 SSH 代理的 Unix 域套接字的路径
  • SSH_AGENT_PID:SSH 代理进程的进程 ID

在不同的环境中使用 SSH 代理 #

在 Bash 启动文件中设置 #

~/.bashrc~/.bash_profile中添加:

# 启动SSH代理(如果尚未运行)
if [ -z "$SSH_AUTH_SOCK" ]; then
    eval $(ssh-agent -s)
    ssh-add
fi

在图形环境中使用 #

许多桌面环境(如 GNOME、KDE)会自动启动 SSH 代理。可以使用以下命令检查:

echo $SSH_AUTH_SOCK

在 systemd 用户服务中使用 #

创建文件~/.config/systemd/user/ssh-agent.service

[Unit]
Description=SSH key agent

[Service]
Type=simple
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -D -a $SSH_AUTH_SOCK

[Install]
WantedBy=default.target

然后启用并启动服务:

systemctl --user enable ssh-agent
systemctl --user start ssh-agent

~/.bashrc中添加:

export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"

转发 SSH 代理 #

在 SSH 配置中启用代理转发 #

~/.ssh/config中添加:

Host example.com
    ForwardAgent yes

或者在命令行中使用-A选项:

安全注意事项 #

代理转发可能存在安全风险,因为远程服务器上的 root 用户可以访问您的 SSH 代理。只在信任的服务器上启用代理转发。

常见问题排查 #

1. 代理连接问题 #

Could not open a connection to your authentication agent.

可能的原因:

  • SSH 代理未运行
  • 环境变量SSH_AUTH_SOCK未设置或不正确

解决方法:

eval $(ssh-agent -s)

2. 密钥添加失败 #

Error loading key: No such file or directory

确保指定的密钥文件存在并且路径正确。

3. 权限问题 #

Permissions 0644 for '/home/user/.ssh/id_rsa' are too open.

解决方法:

chmod 600 ~/.ssh/id_rsa

与其他工具的集成 #

1. Keychain #

keychain是一个管理ssh-agent的前端工具,它可以在多个登录会话之间共享一个 SSH 代理:

keychain ~/.ssh/id_rsa
source ~/.keychain/$HOSTNAME-sh

2. GNOME Keyring #

GNOME 桌面环境包含一个可以替代ssh-agent的组件:

/usr/bin/gnome-keyring-daemon --start --components=ssh

3. KDE Wallet #

KDE 桌面环境使用 KWallet 服务管理 SSH 密钥:

/usr/bin/ssh-add -q < /dev/null

提示 #

  • 使用ssh-add -t设置密钥的生存时间可以提高安全性
  • 在脚本中使用ssh-agent时,记得在完成后终止代理以避免资源泄漏
  • 对于需要频繁 SSH 连接的工作流,ssh-agent可以显著提高效率
  • 结合ssh-agent和密码管理器可以进一步增强安全性
  • 在共享系统上使用ssh-agent时要格外小心,确保在离开前终止代理
  • 使用ssh-add -c可以在每次使用密钥时请求确认,增加额外的安全层