在服务器上创建git账户后提示密码错误,核心原因是认证配置没对,不是你记错了密码。多数情况下,root用户新建的git用户没有设置正确的shell环境,或者系统自带的credential缓存仍在用旧密码,先别急着重置密码,按下面的思路走一遍,基本能定位问题。
分清git账号密码错误的三种场景
服务端git账户报错,很多人习惯性认为就是密码输错了,业内专家指出,git的密码错误提示往往是由认证方式、配置路径和缓存冲突这三类问题共同造成的,作为一个运维老手,我建议你先区分自己是哪种情况。
- 用
git clone https://方式拉代码,提示用户名或密码错误 - 用
git push时报Authentication failed,但明明刚改过密码 - 用SSH方式连接时,提示
Permission denied (publickey,password),但密码是对的
第一和第二种场景,90%和服务器端git账户本身没关系,是你本地机器的credential.helper缓存了旧密码,第三种场景,才是真正要查服务器上git账户配置的问题。
HTTP方式下的credentials缓存坑
如果你在服务器上用HTTP方式克隆仓库,报密码错误,首先检查当前项目的git配置:
git config --list --show-origin
重点看credential.helper这一项,如果显示的是store或者cache,那基本就是缓存在作怪。
- 执行
git credential reject清除全局缓存的用户名密码 - 或者直接编辑
~/.git-credentials文件,把旧密码删掉
很多人在Ubuntu服务器上折腾半天,最后发现就是缓存没清,你以为密码错了,其实是git还在用第一次输入的旧密码。
SSH密钥与密码混用的判断误区
另一种常见情况是,服务器上创建git用户时你们设置了密码,但SSH连接时使用的却是密钥认证,这时候系统优先走公钥验证,公钥不匹配就直接拒绝。
判断方法很简单,跑一下:
ssh -vT git@服务器IP
看输出末尾,如果出现Authenticated with partial success,那说明密码环节有人干预过,但git用户配置了git-shell或nologin,密码登录直接被拒了,这种情况下,密码错误不是你的输入问题,是shell权限把登录流程截断了。
服务器git创建用户后登录失败的常见原因
这是最让人头疼的场景:你明明在服务器上执行了useradd git,也设置了密码,但切换到git用户或者用git用户登录时,总是报密码错误。症结往往在用户的shell设置和home目录权限上。
用户组与home目录的权限陷阱
我见过不少新手,在服务器上创建git账户时用了这条命令:
sudo useradd -m git sudo passwd git
-m参数会创建home目录,但很多人不知道,useradd默认的shell是/bin/sh,不是bash,这会导致git用户登录时加载不了正常的~/.bashrc和~/.bash_profile,环境变量乱套。
但这还不足以解释密码错误,真正的坑在这里:useradd创建用户时,如果/home/git目录的属主和属组没配对,或者后来你用chown不小心改成了root,git用户登录时就会出现诡异的Permission denied。
稳妥的做法是:
sudo useradd -m -s /bin/bash git sudo passwd git sudo chown -R git:git /home/git sudo chmod 755 /home/git
这四条命令走完,再测试登录,如果还是报密码错误,就检查/etc/shadow文件里git用户那一行是否正常,这一行的格式是git:$6$...,如果密码字段是或,说明密码被锁定了。
git-shell限制与密码过期策略
还有一种不那么常见但确实存在的情况,是git账户被配置为/usr/bin/git-shell作为登录shell,这是出于安全考虑,但有一个副作用:如果你通过SSH用密码登录这个账号,系统会调git-shell来验证,git-shell会直接拒绝非git命令。
此时你输入密码后,服务器端返回的不再是典型的Permission denied,而是fatal: unrecognized command,很多人误以为密码错了。
服务器的密码过期策略也会导致新创建的git用户密码失效,检查一下:
sudo chage -l git
如果Password expires这一项显示不久后过期,执行:
sudo chage -M 99999 git
这一条能把有效期拉长,避免莫名奇妙密码失效。
实操排查清单照着做就能解决
如果你不想一条条排查,直接按我这个顺序来,基本几分钟就能搞定。
| 排查步骤 | 具体命令/操作 | 解决目标 |
|---|---|---|
| 清除缓存 | git config --global --unset credential.helper |
解决HTTP认证失败 |
| 测试SSH | ssh -vT git@服务器IP |
定位SSH层报错 |
| 检查shell | grep git /etc/passwd |
确认是否/b |
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/787379.html


