SSH远程连接后执行Git Push失败,提示公钥权限拒绝
嘿,我之前也遇到过一模一样的问题!本地操作Git完全正常,但SSH远程登录后push/pull就报公钥权限拒绝,其实核心原因大多是SSH会话的环境没正确加载你的GitLab密钥,或者会话的用户和你本地操作时不一样。咱们一步步来排查解决:
先确认SSH会话的用户是否和本地一致
有时候SSH登录后可能默认用了root或者其他用户,和你本地操作Git的用户不是同一个。分别在本地和SSH会话里执行:whoami对比两次输出的用户名,如果不一样,要么切换回你本地用的用户(比如
su - 你的用户名),要么给当前SSH会话的用户配置对应的GitLab SSH密钥。检查SSH会话是否加载了密钥
本地操作时,ssh-agent通常已经帮你自动加载了密钥,但SSH远程会话默认不会继承这个agent的状态。在SSH会话里执行:ssh-add -l如果输出
Could not open a connection to your authentication agent.,说明ssh-agent没启动;如果显示没有任何密钥,就是密钥没加载。解决步骤:- 启动ssh-agent:
eval "$(ssh-agent -s)" - 添加你的GitLab密钥(替换成你的密钥文件名,比如
id_rsa):ssh-add ~/.ssh/id_rsa
完成后再试
git push origin master,大概率就能正常运行了。- 启动ssh-agent:
验证SSH连接GitLab的有效性
在SSH会话里执行以下命令(如果是自建GitLab,替换成你的GitLab域名):ssh -T git@gitlab.com如果还是报Permission Denied,检查密钥文件的权限是否正确:
- 密钥文件权限必须是600:
chmod 600 ~/.ssh/你的密钥文件名 - ~/.ssh目录权限必须是700:
chmod 700 ~/.ssh
同时再确认下这个密钥已经添加到你的GitLab账户的SSH密钥列表中(虽然你说两台设备都配置了,但要确保当前SSH会话用户的密钥确实在GitLab里)。
- 密钥文件权限必须是600:
配置自动加载密钥(可选)
如果每次SSH登录都要手动启动agent和添加密钥太麻烦,可以把相关命令加到你的shell配置文件里(比如~/.bashrc或~/.zshrc,取决于你用的shell):if [ -z "$SSH_AUTH_SOCK" ]; then eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa fi这样每次SSH登录后都会自动加载密钥,不用再手动操作。
内容的提问来源于stack exchange,提问作者Addy

