ssh-agent是 Linux/Unix 系统中非常实用的一个后台程序。它的主要作用是在内存中安全地保存你的 SSH 私钥(及其密码)。
使用场景
当为 SSH 私钥设置了密码(Passphrase)以提高安全性时,每次使用该密钥(比如 SSH 登录服务器或 Git 提交)都需要输入密码,这非常繁琐。ssh-agent 就是为了解决这个问题而生的:你只需要在 ssh-agent 启动时输入一次密码解锁私钥,之后在当前会话中使用该私钥时,都不再需要输入密码。
ssh-agent 的基本操作
在开始示例之前,先了解几个核心命令:
-
启动 ssh-agent:
basheval `$(ssh-agent -s)`(注:
ssh-agent启动后会输出几个环境变量,如SSH_AUTH_SOCK和SSH_AGENT_PID,使用eval是为了让这些环境变量直接在当前终端生效,这样 SSH 客户端才能找到 agent。) -
将私钥添加到 ssh-agent:
bashssh-add ~/.ssh/id_ed25519(执行后会提示你输入该私钥的密码。输入一次后,密钥就保存在 agent 的内存中了。)
-
查看已添加的密钥:
bashssh-add -l # 查看指纹 ssh-add -L # 查看完整的公钥内容ssh-agent 不允许导出(提取)私钥
-
从 agent 中删除密钥:
bashssh-add -d ~/.ssh/id_ed25519 # 删除指定密钥 ssh-add -D # 清空所有已添加的密钥 -
关闭 ssh-agent:
bashssh-agent -k
SSH 远程登录使用示例
假设你有一台远程服务器 server.example.com,并且你生成了一个带密码的 SSH 密钥对。
不使用 ssh-agent 的情况
每次登录都需要输密码:
$ ssh user@server.example.com
Enter passphrase for key '/home/user/.ssh/id_ed25519': # 需要手动输入密码
Welcome to Ubuntu...使用 ssh-agent 的情况
# 1. 启动 agent
$ eval `$(ssh-agent -s)`
Agent pid 12345
# 2. 添加私钥并输入一次密码
$ ssh-add ~/.ssh/id_ed25519
Enter passphrase for /home/user/.ssh/id_ed25519: [输入密码]
Identity added: /home/user/.ssh/id_ed25519
# 3. 登录服务器(直接秒进,无需再输密码)
$ ssh user@server.example.com
Welcome to Ubuntu...进阶:SSH Agent 转发 (Agent Forwarding)
假设你需要先登录 跳板机 A,然后再从跳板机 A 登录 内网服务器 B。你不需要把私钥复制到跳板机 A 上,只需要使用 -A 参数开启代理转发:
# 在本地机器上开启转发登录跳板机 A
$ ssh -A user@Server_A
# 此时你在 Server_A 上,直接登录 Server_B,它会调用你本地机器上的 ssh-agent 进行认证!
user@Server_A$ ssh user@Server_B
Welcome to Server B...Git 使用示例
当使用 SSH 协议(如 git@github.com:user/repo.git)克隆、拉取(pull)或推送(push)代码时,底层调用的其实就是 SSH 协议。
如果你使用了带密码的私钥,每次 git push 都会弹提示让你输密码。结合 ssh-agent 可以完美解决:
完整流程:
1. 生成并配置带密码的 SSH 密钥:
# 生成密钥(一路回车,并设置 passphrase 密码)
ssh-keygen -t ed25519 -C `your_email@example.com`然后将生成的 ~/.ssh/id_ed25519.pub 公钥内容添加到 GitHub/GitLab 的 SSH Keys 设置中。
2. 启动并添加密钥到 ssh-agent:
eval `$(ssh-agent -s)`
ssh-add ~/.ssh/id_ed25519
# 在这里输入你刚才设置的密码3. 愉快的 Git 操作(全程无密码打扰):
# 克隆代码
git clone git@github.com:your_username/your_repo.git
# 修改文件后提交并推送
cd your_repo
touch test.txt
git add .
git commit -m `test ssh-agent`
# 推送时不再需要输入密码!
git push origin main终极技巧:让 ssh-agent 随终端自动启动
每次打开新的终端窗口都要敲一遍 eval $(ssh-agent -s)``和ssh-add也很烦人。你可以把以下代码追加到你的~/.bashrc或~/.zshrc 文件末尾。
这段脚本的作用是:打开终端时检查是否已有 ssh-agent 在运行。如果没有,就启动一个;如果有了,就直接复用。
# ~/.bashrc 或 ~/.zshrc 中添加:
SSH_ENV=`$HOME/.ssh/agent-environment`
function start_agent {
echo `Initialising new SSH agent...`
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > `${SSH_ENV}`
chmod 600 `${SSH_ENV}`
. `${SSH_ENV}` > /dev/null
/usr/bin/ssh-add; # 默认加载 ~/.ssh/id_rsa 和 ~/.ssh/id_ed25519
}
# 检查当前是否已经配置了 SSH_AUTH_SOCK 并且 socket 文件存在
if [ -z `$SSH_AUTH_SOCK` ] || [ ! -e `$SSH_AUTH_SOCK` ]; then
# 尝试加载已存在的环境文件
if [ -f `${SSH_ENV}` ]; then
. `${SSH_ENV}` > /dev/null
# 检查里面记录的 pid 进程是否真的还在运行
kill -0 $SSH_AGENT_PID 2>/dev/null || {
start_agent;
}
else
start_agent;
fi
fi配置好后,执行 source ~/.bashrc。你只需在每次开机后第一次打开终端时输入一次私钥密码,之后打开任意多个终端窗口、执行任何 git/ssh 操作,都畅通无阻了!
最近更新
最新评论