在Linux系统中,用户和组的身份标识主要通过ID号来实现,其中用户ID(UID)和组ID(GID)是核心概念,UID用于唯一标识系统中的每个用户,而GID则标识用户所属的组,通过查看这些ID号,可以快速了解用户的权限归属、资源访问控制等信息,本文将详细介绍Linux系统中查看ID号的多种方法,包括核心命令id、系统文件解析、getent工具等,并辅以实例说明和表格对比,帮助读者全面掌握不同场景下的ID号查看技巧。

核心命令:id——查看用户ID信息最直接的方式
id命令是Linux系统中专门用于显示用户和组ID信息的工具,无需额外安装,默认所有Linux发行版均内置,通过id命令,可以快速获取当前用户或指定用户的UID、主GID以及所属的附加组ID,是日常管理和故障排查中最常用的方法。
基本用法:查看当前用户的ID信息
直接在终端输入id命令,不加任何参数,将显示当前登录用户的UID、主GID以及所属的所有附加组ID(Groups)。
id
输出示例(以普通用户testuser为例):
uid=1000(testuser) gid=1000(testuser) groups=1000(testuser),27(sudo),4(adm)
uid=1000(testuser):表示当前用户的UID为1000,用户名为testuser;gid=1000(testuser):表示当前用户的主GID为1000,主组名为testuser;groups=1000(testuser),27(sudo),4(adm):表示用户所属的附加组包括testuser(GID=1000)、sudo(GID=27)、adm(GID=4)。
查看指定用户的ID信息
若要查看其他用户的ID信息,可在id命令后加上用户名作为参数,格式为id 用户名,查看用户nginx的ID信息:
id nginx
输出示例(nginx为系统服务用户,通常UID较低):
uid=33(nginx) gid=33(nginx) groups=33(nginx)
这里nginx用户的UID和GID均为33,且无附加组,符合系统服务用户的特征(UID通常小于1000,避免与普通用户冲突)。
id命令常用参数详解
id命令支持多个参数,用于灵活控制输出信息,以下是常用参数的说明及示例:
| 参数 | 说明 | 示例及输出 |
|---|---|---|
-u 或 --user |
仅显示UID(数字) | id -u testuser输出: 1000 |
-g 或 --group |
仅显示主GID(数字) | id -g testuser输出: 1000 |
-G 或 --groups |
显示所有附加组ID(数字,空格分隔) | id -G testuser输出: 1000 27 4 |
-n 或 --name |
与-u/-g/-G配合使用,显示名称而非数字 |
id -nu testuser输出: testuserid -nG testuser输出: testuser sudo adm |
-r 或 --real |
显示真实ID(RUID/RGID),而非有效ID(EUID/EGID) | id -ru testuser输出: 1000(与-u结果一致,普通用户无区别) |
-Z 或 --context |
显示SELinux安全上下文(需系统启用SELinux) | id -Z testuser输出: unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 |
注意事项:
- 当用户通过
su命令切换到其他用户时,id命令默认显示当前有效用户的ID(即切换后的用户),而非原始用户的ID,若需查看原始用户ID,可通过id命令不加参数(显示当前会话用户)或结合whoami确认当前用户身份。 - 参数可以组合使用,例如
id -ng testuser可同时显示主组名称,输出为testuser。
系统文件解析:直接读取/etc/passwd和/etc/group
Linux系统中,用户和组的核心信息存储在/etc/passwd(用户信息)和/etc/group(组信息)两个文件中,通过解析这些文件,可以直接获取用户的UID、GID及所属组信息,适用于需要底层调试或命令不可用的场景。
解析/etc/passwd文件获取用户UID和主GID
/etc/passwd是文本文件,每一行代表一个用户,字段通过冒号分隔,共7个字段,格式为:用户名:加密密码:UID:GID:用户描述信息:家目录:默认Shell
第3字段为UID,第4字段为主GID,查看/etc/passwd中testuser行的信息:
grep testuser /etc/passwd
输出示例:
testuser:x:1000:1000:Test User:/home/testuser:/bin/bash
UID=1000(第3字段),GID=1000(第4字段),与id命令结果一致;x表示密码字段(实际密码存储在/etc/shadow中);/home/testuser为用户家目录,/bin/bash为默认登录Shell。
解析/etc/group文件获取组信息和附加组
/etc/group文件也是文本文件,每一行代表一个组,字段通过冒号分隔,共4个字段,格式为:组名:组密码:GID:组成员列表
第3字段为GID,第4字段为组成员列表(多个成员用逗号分隔),查看/etc/group中sudo组的信息:

grep sudo /etc/group
输出示例:
sudo:x:27:testuser,admin
GID=27(第3字段),组成员包括testuser和admin(第4字段),说明testuser属于sudo组,因此可通过sudo获取管理员权限。
组合使用awk提取关键信息
若需批量提取用户的UID和GID,可结合awk工具解析/etc/passwd,列出所有系统用户(UID<1000)的UID和用户名:
awk -F: '($3 < 1000) {print $1 " UID=" $3}' /etc/passwd
输出示例:
root UID=0
daemon UID=1
bin UID=2
......
nginx UID=33
同样,提取所有组的GID和组名:
awk -F: '{print $1 " GID=" $3}' /etc/group
输出示例:
root GID=0
daemon GID=1
bin GID=2
......
testuser GID=1000
getent命令:查询系统数据库中的ID信息
getent命令用于查询系统配置数据库(如passwd、group等)中的条目,与直接读取/etc/passwd或/etc/group文件的区别在于:getent会同时查询本地文件和远程数据库(如NIS、LDAP等),适用于网络环境或多用户管理的场景。
查询用户信息(等同于getent passwd)
getent passwd 用户名
查询用户testuser的信息:
getent passwd testuser
输出与grep testuser /etc/passwd一致,但若用户来自远程认证服务器(如LDAP),getent仍能查询到,而直接读取/etc/passwd则无法获取。
查询组信息(等同于getent group)
getent group 组名
查询sudo组的信息:
getent group sudo
输出与grep sudo /etc/group一致,但同样支持远程组查询。
列出所有用户或组的ID信息
若需批量查看所有用户的UID或所有组的GID,可通过管道结合awk处理:
# 列出所有用户及UID(含远程用户)
getent passwd | awk -F: '{print $1 " UID=" $3}'
# 列出所有组及GID(含远程组)
getent group | awk -F: '{print $1 " GID=" $3}'
辅助命令:间接关联ID信息
除上述方法外,部分命令虽不直接显示ID号,但可通过输出结果关联推导出ID信息,辅助用户身份确认。
whoami:显示当前用户名
whoami
输出示例:
testuser
结合id testuser即可获取当前用户的ID信息。

finger:查看用户详细信息(需安装)
finger命令可显示用户的登录名、姓名、终端、空闲时间、家目录等信息,部分系统会附带UID和GID(需安装finger包,如sudo apt install finger或sudo yum install finger)。
finger testuser
输出示例:
Login: testuser Name: Test User
Directory: /home/testuser Shell: /bin/bash
Last login Sun Nov 5 10:30 2023 on pts/0
No mail.
No Plan.
UID: 1000 GID: 1000
users:显示当前登录用户
users
输出示例:
testuser admin
表示当前有testuser和admin两个用户登录,结合id testuser和id admin可分别查看其ID信息。
不同情况下的ID号查看选择
| 场景 | 推荐方法 | 优点 |
|---|---|---|
| 日常快速查看当前用户ID | id |
简单直接,输出清晰 |
| 查看指定用户的UID/GID | id 用户名 |
精准定位,支持参数定制 |
| 底层调试或文件分析 | 解析/etc/passwd//etc/group |
直观展示系统原始数据 |
| 网络环境或多用户认证 | getent passwd/getent group |
支持本地+远程数据库查询 |
| 批量提取用户/组ID | getent+awk |
适合脚本自动化处理 |
相关问答FAQs
问题1:id命令显示的UID和EUID有什么区别?什么情况下会不同?
解答:
- UID(Real User ID,真实用户ID):标识用户的真实身份,即登录时的用户身份,通常由
/etc/passwd文件决定。 - EUID(Effective User ID,有效用户ID):标识进程当前的有效权限,可能通过
setuid机制临时改变(如sudo命令或passwd命令)。
区别场景:
- 普通用户执行命令时,UID和EUID一致;
- 当用户执行具有
setuid权限的程序时(如passwd命令,所有者为root,权限为-rwsr-xr-x),EUID会临时变为root(UID=0),而UID保持不变(仍为原用户ID)。# 查看passwd命令的权限 ls -l /usr/bin/passwd # 输出:-rwsr-xr-x 1 root root 63816 5月 10 2023 /usr/bin/passwd # 普通用户执行passwd时,EUID临时变为root id -u # 显示真实UID(如1000) sudo id -u # 显示有效UID(0,root)
问题2:为什么用id username查看时,有些用户显示的GID和/etc/passwd中的GID不一致?
解答:
这种情况通常由临时组切换或有效GID(EGID)导致,具体原因如下:
-
newgrp命令切换临时组:
用户可通过newgrp命令临时切换到其他组,此时当前会话的有效GID(EGID)会变为目标组的GID,但真实GID(RGID,即/etc/passwd中的GID)保持不变。# 用户testuser主GID为1000,属于`dev`组(GID=1005) id testuser # 输出:gid=1000(testuser), groups=1000(testuser),1005(dev) # 切换到dev组 newgrp dev # 此时有效GID变为1005 id -g # 输出:1005(dev组的GID) # 但真实GID仍为1000 id -rg # 输出:1000(testuser的主GID)
-
进程的有效GID(EGID):
与EUID类似,EGID可通过setgid机制改变,例如具有setgid权限的程序执行时,进程的EGID会变为程序所属组的GID,而用户的真实GID(RGID)不变。 -
/etc/passwd文件被修改但未生效:
若手动修改了/etc/passwd中用户的主GID字段,但用户仍处于登录状态,可能需要重新登录或使用su - 用户名切换会话才能使新GID生效(id命令显示的是当前会话生效的GID)。
解决方法:
- 若需查看用户真实GID(
/etc/passwd中的GID),使用id -rg 用户名; - 若需查看当前会话的有效GID,使用
id -g 用户名; - 若需查看用户所属的所有组(含临时组),使用
id -G 用户名。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/24497.html