SSH连接正常,但通过SSH执行git push失败,原因何在?
问题情况
我在NearlyFreeSpeech.net服务器上配置了git hook,用以下命令设置了远程仓库:git remote add nfsn ssh://USERNAME@NFSNSERVER/home/private/git/REPONAME.git
但执行git push nsfn master时,一直卡在密码输入提示,输入正确密码后还是反复弹出。不过直接执行ssh USERNAME@NFSNSERVER能正常登录,用户名和密码都确认过没问题。
解决步骤
先检查远程仓库名称的拼写:你设置的远程仓库名是
nfsn,但push时写的是nsfn——这是明显的拼写错误!先执行git remote -v确认远程仓库的正确名称,然后用正确的名字执行push,比如git push nfsn master,这大概率能直接解决问题。查看Git SSH连接的详细日志:如果拼写没问题,执行带调试参数的push命令,看具体哪里出错:
GIT_SSH_COMMAND="ssh -v" git push nfsn master
日志里会显示SSH连接的每一步,比如是密钥验证失败,还是服务器端的仓库权限问题。确认服务器端仓库的权限:登录服务器后,检查仓库目录的所有者和权限:
ls -ld /home/private/git/REPONAME.git
确保目录所有者是你的USERNAME,权限至少是755(或更严格的700),如果不对,用以下命令调整:chown -R USERNAME:USERNAME /home/private/git/REPONAME.gitchmod -R 700 /home/private/git/REPONAME.git改用SSH密钥登录代替密码:既然直接SSH能登录,说明密码没问题,但Git可能没自动用密钥。先在本地生成密钥(如果还没的话):
ssh-keygen
然后把本地~/.ssh/id_rsa.pub里的内容复制到服务器的~/.ssh/authorized_keys文件中,确保服务器上.ssh目录权限是700,authorized_keys权限是600:chmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keys
之后Git应该会自动用密钥验证,不用再输密码。
内容的提问来源于stack exchange,提问作者logeyg

