Git为何使用错误SSH密钥?Ubuntu环境指定密钥方案咨询
解决Git优先使用登录转发密钥而非本地SSH密钥的问题
我懂你的情况——通过PuTTY搭配Pageant用my-key登录Ubuntu服务器后,拉取Git仓库代码时,Git居然自动用了登录用的my-key,而不是你存在Ubuntu用户~/.ssh目录里的coders-key对吧?这本质是SSH Agent转发在搞鬼:PuTTY默认开启了Agent转发,导致Ubuntu上的SSH会优先使用本地Pageant里的密钥,而不是服务器本地的密钥。
下面给你几个实用的解决办法,按需选择:
方法1:临时给单个Git仓库指定密钥
如果只是临时操作某个仓库,直接在Git命令里指定SSH密钥即可:
# 克隆仓库时指定密钥 GIT_SSH_COMMAND="ssh -i ~/.ssh/coders-key" git clone git@your-git-domain:your/repo.git # 如果已经克隆过仓库,进入仓库目录后设置局部配置,后续操作自动用这个密钥 git config core.sshCommand "ssh -i ~/.ssh/coders-key"
方法2:配置SSH规则自动匹配仓库密钥(推荐)
如果多个仓库需要用不同密钥,最省心的方式是在Ubuntu上配置~/.ssh/config文件,让特定Git域名自动对应coders-key:
- 创建或编辑
~/.ssh/config文件:
nano ~/.ssh/config
- 添加以下规则(替换成你的Git服务器域名和密钥路径):
Host your-git-domain IdentityFile ~/.ssh/coders-key IdentitiesOnly yes
Host填写你的Git仓库所在域名(比如github.com或者公司内部的Git域名)IdentitiesOnly yes是关键:它强制SSH只使用你指定的这个密钥,不会去尝试其他密钥(包括转发过来的my-key)
- 给配置文件设置正确权限(SSH对权限要求很严):
chmod 600 ~/.ssh/config
之后访问这个域名的Git仓库,SSH就会自动用coders-key了。
方法3:关闭PuTTY的Agent转发(仅适合不需要转发的场景)
如果你完全不需要在Ubuntu上使用本地Pageant里的其他密钥,可以直接关闭PuTTY的Agent转发功能:
- 打开PuTTY,找到你保存的Ubuntu会话
- 左侧导航到
Connection > SSH > Auth - 取消勾选
Allow agent forwarding选项 - 保存会话后重新登录Ubuntu
这样登录后,Ubuntu上的SSH只能使用本地的密钥,Git自然会优先用coders-key。但这个方法会切断本地Pageant密钥的转发,如果你需要在Ubuntu上用其他本地密钥访问服务,就不适用了。
方法4:在Ubuntu上启动本地SSH Agent并添加密钥
如果想同时保留Agent转发和本地密钥优先级,可以在Ubuntu上启动自己的SSH Agent,把coders-key加进去:
- 登录Ubuntu后,启动本地Agent:
eval "$(ssh-agent -s)"
- 将
coders-key添加到本地Agent:
ssh-add ~/.ssh/coders-key
- 之后Git操作会优先使用本地Agent里的密钥。如果想每次登录自动执行这两步,把上面两行添加到
~/.bashrc(或~/.zshrc,如果你用zsh)文件末尾即可。
最后注意事项
确保coders-key的文件权限正确,否则SSH会拒绝使用:
chmod 600 ~/.ssh/coders-key
内容的提问来源于stack exchange,提问作者user28795
相关产品推荐
相关产品推荐

