Git 命令如何指定使用哪个 SSH 私钥
四种方式:GIT_SSH_COMMAND 临时指定、~/.ssh/config 按 Host 配置(推荐)、ssh-add 进代理、core.sshCommand 按仓库配置。多账号/多密钥场景一文搞定。
一句话回答:临时单次用 GIT_SSH_COMMAND="ssh -o IdentitiesOnly=yes -i ~/.ssh/指定密钥" git clone ...;长期方案推荐编辑 ~/.ssh/config,按 Host 为不同服务/账号指定不同 IdentityFile——配置在保留且未被更高优先级选项覆盖时持续生效,git 命令照常使用。
方式一:GIT_SSH_COMMAND(临时单次)
GIT_SSH_COMMAND="ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519_work" git clone git@github.com:org/repo.git
-i 指定文件,IdentitiesOnly=yes 避免额外尝试 agent 中未显式配置的身份;若配置文件有多个 IdentityFile,仍需检查最终配置。Windows(PowerShell)的环境变量赋值会持续到当前进程结束或手动恢复,不是仅对下一条命令生效:$env:GIT_SSH_COMMAND="ssh -o IdentitiesOnly=yes -i C:\Users\你\.ssh\id_ed25519_work"。
方式二:~/.ssh/config(推荐)
# 个人 GitHub
Host github.com
IdentityFile ~/.ssh/id_ed25519_personal
IdentitiesOnly yes
# 公司 GitHub(用别名区分)
Host github-work
HostName github.com
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
用别名克隆:git clone git@github-work:org/repo.git。config 文件让"哪个 Host 用哪把钥匙"变成声明式配置,所有 ssh 操作(不止 git)都受益。
方式三:ssh-agent
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519_work # 加载到代理
git clone git@github.com:org/repo.git
agent 会依次尝试已加载的密钥。多账号时容易"试了错的 key 被拒",不如 config 精确。
方式四:按仓库固定(core.sshCommand)
git config core.sshCommand "ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519_work"
写进当前仓库的 .git/config,只影响这个仓库——适合"这个项目固定用工作 key"的场景,与全局 config 互补。
验证用的哪把钥匙
ssh -T git@github.com # 输出 Hi 用户名! 即知当前身份
GIT_SSH_COMMAND="ssh -v -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519_work" git ls-remote origin
# 只读取远程引用;在本地检查 Offering public key / Server accepts key 等日志
常见问题(FAQ)
Q:密钥权限不对报错 "permissions are too open"?
A:SSH 要求私钥严格权限:chmod 600 ~/.ssh/id_ed25519_work、目录 chmod 700 ~/.ssh。
Q:一台电脑两个 GitHub 账号,push 总是用了错的身份?
A:ssh 默认按顺序试密钥,第一个能认证的就生效——可能不是你想要那个账号。用方式二的 Host 别名把两个账号彻底分开,并在仓库里配 git config user.email 区分提交元数据;user.email 不决定 SSH 登录账号。
Q:CI 里怎么用指定密钥?
A:CI 可使用权限最小化的 Deploy Key。由密钥管理功能将私钥安全写入权限受限的临时文件,DEPLOY_KEY_PATH 必须是文件路径而非私钥内容;用 ssh -i "$DEPLOY_KEY_PATH" -o IdentitiesOnly=yes -o StrictHostKeyChecking=yes。预先通过可信渠道核对服务器主机密钥并配置 known_hosts,不把首次自动接受未知主机当作 CI 安全默认值。任务结束清理文件,不打印私钥。
核查依据
本文依据官方文档核对,示例未在实际业务环境运行;上线前请按部署版本、权限与数据范围验证。