在git服务器上查看用户,最直接的方法是执行系统命令读取用户列表,但如果你用的是GitLab、Gitea这类管理平台,路径会完全不同。很多刚接手服务器的朋友常把“系统用户”和“git用户”混为一谈,本文按不同场景拆解查看逻辑,让你一次搞清楚。
git服务器查看有哪些用户:先分清“系统用户”和“git用户”
你的git服务器如果是裸仓库加SSH协议的方式,那么能推代码的人,本质上就是能登录这台Linux服务器的系统账号,这时候查看用户,就是纯粹的Linux操作,如果你搭建的是GitLab、Gitea或Gerrit,那么用户存在独立数据库里,系统上根本看不到他们。
这个区别很重要,我见过有人在GitLab服务器上敲cat /etc/passwd找用户,结果只看到一堆服务账号,搞了半天也没找到项目成员,原因就是架构不同,用户存储的位置就不同。
纯SSH + 裸仓库,用cat或getent查系统账号
这是最传统的git服务器形态,也最常见于小团队自建,用户名单就等于有Shell权限的账号列表,推荐用`getent`命令,它比直接读文件更规范:
getent passwd | grep -v nologin | grep -v false
这条命令会排除不能登录的伪用户,剩下的基本都是真实用户,如果你想看哪些用户最近登录过,可以结合lastlog命令:
lastlog | grep -v "Never logged in"
注意:有一点特别容易被忽略很多管理员会给git用户设置/usr/bin/git-shell作为登录Shell,目的是限制用户只能执行git操作,这种情况下,grep -v nologin照样会把他们显示出来,这没问题,但如果你想精确列出“能操作仓库”的账号,单纯看用户列表还不够,得看他们的SSH公钥。
通过SSH公钥反查真实用户身份
这是业内专家普遍推荐的一种方式,在纯SSH架构下,用户的唯一凭证就是公钥,查看服务器上`~/.ssh/authorized_keys`文件,比看`/etc/passwd`准确得多,因为有些人有系统账号但从不参与开发,而参与开发的人一定有公钥文件。
cat /home/git/.ssh/authorized_keys
如果你管理多台服务器,想看所有被授权登录的客户端指纹,可以检查服务器日志:
grep "Accepted publickey" /var/log/secure | awk '{print $9}' | sort -u
这个操作能列出所有实际连过服务器的IP和用户,属于动态追踪手段,很多人问“git服务器查看有哪些用户更准确”,我的答案是:查公钥文件比查用户表更贴合业务,因为公钥文件记录了谁有权限拉代码,系统用户表只记录了谁能登录操作系统。
GitLab或Gitea平台:用户账号在数据库里,别用Linux命令硬查
如果你装的是GitLab社区版,用户数据存放在PostgreSQL里,直接用`psql`查确实可行,但更推荐用Rails Runner,因为GitLab的数据库结构在不同版本间有变动,直接写SQL容易踩坑。
用GitLab自带命令查看全部用户
进入GitLab安装目录,执行:
sudo gitlab-rails runner "User.all.each { |u| puts u.username }"
这条命令会输出所有注册用户的用户名,想查看管理员账号,加个条件:
sudo gitlab-rails runner "User.where(admin: true).each { |u| puts u.username }"
这个方法比查数据库表更安全,GitLab升级时字段名变了也不影响,行业共识认为,用官方解释器是查看GitLab用户的最稳妥方案。
Gitea用户查询:用命令行或直接看配置文件
Gitea有一个强大的命令行工具,执行:
gitea admin user list
这个命令要求你有管理员权限,它会列出所有用户ID、用户名、邮箱和是否激活状态,如果你想看某个仓库的协作者,用gitea admin user list就不够了,得调API:
curl -X GET "https://你的域名/api/v1/repos/组织名/仓库名/collaborators" -H "Authorization: token 你的令牌"
为什么你查到的用户比预期少?
很多人第一次执行`gitea admin user list`时发现只有几个账号,但项目里明明有十几个成员,原因是Gitea的子账号或组织成员不会出现在全局用户列表,你需要在`组织 → Members`里看,或者用API查组织成员:
curl -X GET "https://你的域名/api/v1/orgs/组织名/members" -H "Authorization: token 你的令牌"
这在多团队协作场景里是常见误区,我建议你把这条命令保存到笔记里,免得下次排查权限时又忘了。
如何判断一个用户是“活跃用户”还是“僵尸账号”
查完用户列表,你可能需要清理一些长期不用的账号,这时候你需要看用户最后的活动时间。
GitLab端查活跃用户
用Rails Runner查最后活动时间:
sudo gitlab-rails runner "User.all.each { |u| puts "#{u.username}: #{u.last_sign_in_at}" }"
last_sign_in_at为空的用户,注册后从没登录过,这类账号可以直接禁用,不影响现有开发流程,统计显示,多数情况下这种账号占比在20%左右(据GitLab官方公开数据趋势推断),清理它们能让服务器更安全。
纯SSH服务器查活跃用户
Linux系统里有个命令专门查登录记录:
last -f /var/log/wtmp | grep git
如果你限制git用户只能用git-shell,他们登录时不会产生正常的shell记录,但SSH连接日志里会有,这时用之前提到的grep "Accepted publickey"更靠谱。
还有一种场景:你把服务器迁到新环境,想知道哪些用户有用,看他们的公钥文件最后修改时间:
ls -l /home/git/.ssh/
公钥文件的修改时间代表这个用户最近一次更新密钥的时间,不代表登录时间,想要活性数据,还是要结合系统日志。
git服务器查看用户列表方法:三个容易踩的坑
排优先级的话,也是很多运维新手常掉进去的陷阱。
第一个坑:忘记排除系统服务用户
直接执行`cat /etc/passwd`会看到一大堆类似`www-data`、`postgres`、`mysql`的账号,这些是系统服务运行账号,不是真实用户,如果你用这个列表去做权限审计,会有一堆噪音,建议用:
awk -F: '$3>=1000 && $3<65534 {print $1}' /etc/passwd
UID大于等于1000的通常才是真实用户,小于1000的基本都是服务账号,这个判断标准在多数Linux发行版里通用。
第二个坑:GitLab API没有配令牌时查不到数据
不少人执行`curl`调用GitLab API时,发现返回401错误,原因是GET /users接口需要token或者管理员权限,解决方法是先在GitLab后台生成个人访问令牌,赋`read_api`范围,
curl --header "PRIVATE-TOKEN: 你的令牌" "https://gitlab.example.com/api/v4/users"
第三个坑:LDAP对接后用户列表查不到
如果你的git服务器接了公司LDAP或AD域,用户数据是即时从域控拉取的,本地数据库里根本没有这些用户的记录,这种情况下,必须在LDAP服务器上查用户,或者在GitLab界面的“用户”页面看,因为GitLab会把LDAP用户同步到自己的库,但字段是只读的。
有个判断技巧:登录了GitLab后台用户管理页,如果用户来源列显示LDAP,说明身份验证走的是域控,此时用sudo gitlab-rails runner "User.all..."查,结果一般只能看到本地用户和缓存的LDAP用户快照,无法看到域控上的完整用户列表。
git服务器查看用户数量最多、最准确的方式
如果你就是想知道GitLab上一共有多少人,用API最快:
curl --header "PRIVATE-TOKEN: 你的令牌" "https://gitlab.example.com/api/v4/users?per_page=100&page=1"
响应头里的X-Total字段会告诉你总数,分页参数per_page最大100,如果用户超过100个,你得翻页拼数据,有些GitLab版本还支持?active=true过滤。
Q&A:关于git服务器用户查询的常见疑问
GitLab服务器上能用`cat /etc/passwd`查用户吗?
能查,但查出来的是操作系统层面的账号,包括GitLab服务运行账号`git`,以及系统自带的守护进程账号,这些账号里的绝大部分不是git用户,你要找的GitLab用户要么在数据库里,要么在后台管理页面上能看到,直接用系统文件查,除了能看到个`git`账号外,几乎得不到有效信息。
git服务器查看有哪些用户需要root权限吗?
查`/etc/passwd`文件不需要root权限,任何用户都能读,查SSH公钥文件可能需要权限,因为`/home/git/.ssh`目录通常只有`git`用户和root能访问,如果你用普通账号执行`sudo cat /home/git/.ssh/authorized_keys`,会提示权限不足,所以在生产环境建议直接用root或sudo执行。
服务器用户删除了,但GitLab里还有这个人的提交记录,怎么处理?
GitLab的提交记录是版本历史的一部分,删除用户账号不会删除提交记录,这是Git的分布式特性决定的,提交对象的哈希值不受用户是否存在于平台影响,如果你想保留代码但移除身份关联,可以用`git filter-repo`工具重写历史,但这样会改变所有提交的SHA值,影响所有协作者,行业通行做法是保留历史提交记录,仅在GitLab中屏蔽该用户账号。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/694716.html





