Linux 系统用 UID(用户标识号)识别每个账号,以下 4 条命令覆盖查看自己和他人的 UID/GID 全场景,均经 WSL2 验证。
id:最完整的用户身份信息
id 命令同时显示真实 UID、有效 UID、GID 和所属附加组,无参数时默认查看当前用户 [1]。
id
# uid=1000(username) gid=1000(username) groups=1000(username)
常用选项:
id -u— 只输出真实 UID,适合脚本 [1]id -g— 只输出真实 GIDid -G— 输出所有 GID(数字)id -Gn— 输出所有附加组名
getent passwd:读取 NSS 用户库
getent passwd <用户名> 从 Name Service Switch 读取 /etc/passwd 整行,支持 LDAP/NIS 等远程认证 [4]。
getent passwd username
# username:x:1000:1000:姓名:/home/username:/bin/bash
输出格式与 /etc/passwd 一致:第 3 字段是 UID,第 4 字段是 GID [2]。
whoami:快速查看当前用户名
whoami 只输出有效用户名,适合判断 su 或 sudo 后的身份切换 [3]。
whoami
# username
/etc/passwd:直接读取用户数据库
/etc/passwd 每行对应一个账号,冒号分隔,第 3 字段为 UID,第 4 字段为 GID [2]。
grep "^username:" /etc/passwd
# username:x:1000:1000:姓名:/home/username:/bin/bash
排错速查表
| 现象 | 原因 | 处理 |
|---|---|---|
id 和 whoami 输出不同用户 |
设置了有效 UID(setuid 程序) | id -u 看真实 UID |
getent passwd 找不到用户 |
用户来自远程 NSS,本地无记录 | 确认 nsswitch.conf 配置 |
/etc/passwd 没有该用户 |
用户仅存在于 LDAP/SSSD | 用 getent 替代 |
回滚与局限性
/etc/passwd不应手动编辑,使用vipw命令防止并发损坏 [2]- UID 0 是超级用户,普通进程无法将他人 UID 改为 0
- 容器环境可能不包含所有系统用户
附录
- 测试机:WSL2 Ubuntu 24.04.4 LTS
- 内核:Linux 6.6.114.1-microsoft-standard-WSL2
- 测试日期:2026-11-02
- 观察结果:
id输出 uid=0(root) gid=0(root) groups=0(root),id -u输出 0,getent passwd root输出 root:x:0:0:root:/root:/bin/bash,whoami输出 root,id -Gn输出 root。
参考资料
- [1] id(1) – print user identity(id(1))
- [2] passwd(5) – password file(passwd(5))
- [3] whoami(1) – print effective user name(whoami(1))
- [4] getent(1) – get entries from Name Service Switch libraries(getent(1))
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。