想确认自己在 Linux 里的真实身份?本文用 whoami、id、groups 等命令逐层拆解。
草稿待审 — whoami、id、groups、su、sg、/proc/self/status、getent 已在 WSL Ubuntu-24.04 实测通过;newgrp 基于文档核查,尚未实际执行。
1. 当前用户名:whoami
whoami 只做一件事:打印当前有效用户名。它等价于 id -un,适合快速判断”我现在是谁”。
whoami
预期输出形如 root 或普通用户名。如果你刚执行过 su 或 sudo -i,这里会显示切换后的目标用户。
2. 完整身份信息:id
id 是查看用户权限的核心命令,同时输出 UID、GID 和所有附加组。
id
常见精简用法:
id -u # 仅输出有效 UID(数字)
id -g # 仅输出有效 GID
id -G # 输出所有组的 GID 列表
id -un # 仅输出用户名
id -gn # 仅输出主组名
在 WSL 实测中,root 的 id 输出为 uid=0(root) gid=0(root) groups=0(root);普通用户则显示 1000+ 的 UID。
3. 所属组列表:groups
groups 直接列出当前用户所属的所有组名称,省略数字 ID,更易阅读。
groups
不加参数时查看自己,加用户名可查看他人:
groups testuser
与 id -Gn 输出内容一致,只是格式不同。
4. 切换身份:su
su 让你以另一个用户身份运行命令或进入交互式 shell。它依赖目标用户的密码,或 PAM 配置。
su - username
- 表示加载目标用户的环境变量。不加用户名时默认切到 root。
sudo 则走 /etc/sudoers 授权,适合执行单条 privileged 命令:
sudo command
sudo -n 会在需要密码时报错退出,不会阻塞等待输入。
5. 进阶读取:/proc、getent
除了用户态命令,内核和 NSS 也暴露了权限信息。
# 查看当前进程的真实/有效 UID、GID
cat /proc/self/status | grep -E '^(Uid|Gid|Groups):'
# 通过 NSS 查询用户和组数据库
getent passwd username
getent group groupname
/proc/self/status 的 Uid/Gid 四列分别对应真实、有效、保存 set-user-ID 和文件系统 ID;Groups 列出所有附加组。getent 会读取 /etc/nsswitch.conf 配置的数据库,不只是本地文件。
排错速查表
| 现象 | 原因 | 处理 |
|---|---|---|
| su 提示密码错误 | 目标用户密码不匹配 | 确认密码或改用 sudo |
| sudo 提示 “not in the sudoers file” | 用户未配置 sudo 权限 | 由 root 在 /etc/sudoers 中添加 |
| id 报错 “cannot print only of more than one choice” | 同时传递多个互斥单字母选项 | 分开执行,如 id -u && id -g |
| groups 与 id -Gn 结果不一致 | 会话期间组数据库被修改 | 重新登录或执行 newgrp |
局限性
- WSL2 环境中的用户权限与真实 Linux 发行版行为一致,但 Windows 侧对 WSL 用户的管控(如 WSL 用户的 UID/GID 映射)不在本文范围内。
- 本文未涉及 LDAP/NIS 等远程 NSS 后端的调试,仅覆盖本地文件和标准配置。
- su 和 sudo 的 PAM 配置差异较大,企业环境可能限制 su 或要求额外 MFA。
附录:实测记录
测试环境:WSL2 Ubuntu-24.04,systemd 启用,内核 5.15.104.1-microsoft-standard-WSL2。 测试账户:root(UID 0)与 testuser(UID 1003,GID 1003)。
关键命令实测结果:
whoami→ rootid→ uid=0(root) gid=0(root) groups=0(root)id -u→ 0id -g→ 0id -G→ 0id -un→ rootid -gn→ rootgroups→ rootsu - testuser -c "id; groups; whoami"→ uid=1003(testuser) gid=1003(testuser) groups=1003(testuser);testuser;testusersu - testuser -c "sudo -n whoami"(配置 NOPASSWD 后)→ rootcat /proc/self/status | grep -E '^(Uid|Gid|Groups):'(root)→ Uid: 0 0 0 0 / Gid: 0 0 0 0 / Groups: 0cat /proc/self/status(testuser)→ Uid: 1003 1003 1003 1003 / Gid: 1003 1003 1003 1003 / Groups: 1003sg testuser -c "id; groups"→ uid=0(root) gid=1003(testuser) groups=1003(testuser),0(root)getent passwd testuser→ testuser:x:1003:1003::/home/testuser:/bin/bashgetent group testuser→ testuser:x:1003:
附录:参考资料
[1] id(1) — coreutils — Debian bookworm. https://manpages.debian.org/bookworm/coreutils/id.1.en.html 访问日期 2026-11-02. 支持:id 命令的选项与输出格式。
[2] whoami(1) — coreutils — Debian bookworm. https://manpages.debian.org/bookworm/coreutils/whoami.1.en.html 访问日期 2026-11-02. 支持:whoami 的功能定义与 id -un 等价关系。
[3] groups(1) — coreutils — Debian bookworm. https://manpages.debian.org/bookworm/coreutils/groups.1.en.html 访问日期 2026-11-02. 支持:groups 命令的用法与输出格式。
[4] su(1) — Ubuntu jammy. https://manpages.ubuntu.com/manpages/jammy/man1/su.1.html 访问日期 2026-11-02. 支持:su 的选项说明、默认行为与 PAM 集成。
[5] sudoers(5) — sudo — Debian bookworm. https://manpages.debian.org/bookworm/sudo/sudoers.5.en.html 访问日期 2026-11-02. 支持:sudoers 文件格式与权限配置机制。
参考资料
- [1] id(1) — coreutils — Debian bookworm(debian-id)
- [2] whoami(1) — coreutils — Debian bookworm(debian-whoami)
- [3] groups(1) — coreutils — Debian bookworm(debian-groups)
- [4] su(1) — Ubuntu jammy(ubuntu-su)
- [5] sudoers(5) — sudo — Debian bookworm(debian-sudoers)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。