多台开发服务器共享 SSH 密钥的两种姿势
2026-05-19
场景
手上有几台开发服务器,每台都要拉代码、推代码。传统做法是每台机器生成一套密钥,把公钥分别注册到 Git 平台。机器一多就很烦。
实际就两条路:SSH Agent Forwarding 和 拷同一把密钥。
方案一:SSH Agent Forwarding(推荐)
核心思路:私钥只放在信任的"入口机器"上,其他服务器通过 SSH 连接时把 agent 转发过去。
入口机器配置
# ~/.ssh/config
Host dev-*
ForwardAgent yes
或者对单个主机:
ssh -A user@dev-server实际效果
# 入口机器(持私钥)
ssh -A dev-1 # 连到 dev-1,agent 带着
git ls-remote ... # 直接用入口机器的密钥认证,dev-1 上无需任何密钥文件
ssh -A 会把本地 SSH agent 的 socket 转发到远程机器。远程的 git 操作通过这个 socket 回本地做签名,私钥本身不离开入口机器。
安全提醒
只在自己控制的服务器上开 ForwardAgent。如果 dev-1 被攻破,攻击者可以通过转发的 agent socket 冒充。更安全的做法是用 ssh -a(默认)关掉转发,只在需要时用 -A 打开。
方案二:同一把密钥分发(省事)
Agent Forwarding 要求开发链路是"入口机 → 开发机"。如果开发机各自独立上网(比如都是公网直连),那就直接拷密钥:
# 在已有机器上
scp ~/.ssh/id_ed25519_gitea ~/.ssh/config ~/.ssh/known_hosts user@新机器:~/.ssh/# 在新机器上
chmod 600 ~/.ssh/id_ed25519_gitea ~/.ssh/config我的选择
我走的路线是同密钥分发——一个人用,图省事。SSH config 把端口、密钥文件、主机名都写好,新机器拷三份文件过去就完事:
~/.ssh/
├── config # Host 配置,含 Port / IdentityFile
├── id_ed25519_gitea # 私钥,chmod 600
└── known_hosts # 免去首次连接确认
配合 .gitconfig 里配好 user 信息,任何一台机器 clone/push 都是无感的。
总结
| 方案 | 适用场景 | 安全 |
|---|---|---|
| Agent Forwarding | 跳板机 + 内网开发机 | 高(私钥不动) |
| 同密钥分发 | 独立公网服务器 | 中(注意密钥保护) |
| 每机独立 Deploy Key | 团队 / 需要细粒度权限 | 高(可逐机吊销) |
三选一,取决于网络拓扑和风险偏好。