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 安全默认值。任务结束清理文件,不打印私钥。

核查依据

本文依据官方文档核对,示例未在实际业务环境运行;上线前请按部署版本、权限与数据范围验证。


延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台