最可靠方法是直接查看 /etc/group 文件,其内容即系统全部本地用户组,每行格式为“组名:密码占位符:gid:成员列表”,成员字段仅含附加用户、不含主组用户。

直接看 /etc/group 文件最可靠
Linux 所有用户组的定义都固化在 /etc/group 里,没有其他权威来源。它不依赖服务、不缓存、不合并网络目录(如 LDAP),只要文件存在且可读,内容就是当前系统认可的全部组集合。
执行 cat /etc/group 就能看到全部组,每行格式为:组名:密码占位符:GID:成员列表。其中密码字段几乎总是 x,真实密码(如有)在 /etc/gshadow;成员列表是逗号分隔的用户名,**只包含该组的附加成员,不包含主组用户**。
- 主组用户不会出现在这个字段里——比如用户
alice的主组是users,但users行的成员字段为空或不含alice - GID 为 0 的组(通常是
root)系统关键,修改需谨慎 - 组名含空格或特殊字符?基本不可能——
/etc/group规范禁止,遇到这种行大概率是文件损坏或手工误写
用 getent group 查网络+本地混合环境
如果系统启用了 LDAP、SSSD 或 NIS,/etc/group 只反映本地组,而 getent group 会按 /etc/nsswitch.conf 配置顺序查询所有源,返回完整结果。
例如:
getent group sudo
可能返回本地定义的 sudo:x:27:,也可能返回 LDAP 中的 sudo:x:1001:alice,bob——取决于 nsswitch.conf 里 group: 行的配置顺序(如 files sss)。
- 仅查本地组?加
files前缀:getent files group - 想确认某组是否存在(不管来源)?直接
getent group 组名比grep更准,避免匹配到注释或部分字符串 -
getent不显示空组(无成员且非主组),这点和cat /etc/group不同
groups 和 id 命令只显示“生效组”,不是全量
groups 和 id 输出的是当前用户(或指定用户)**实际拥有的组权限**,即:主组 + 所有附加组。它们不列出系统存在的组,也不列空组或未分配给任何用户的组。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
例如:
id -Gn alice
输出 alice users docker,说明 alice 当前会话能以这三个组身份访问资源;但不代表系统里只有这三个组——可能还有 ftp、adm 等未被任何人加入的组。
-
groups默认查当前用户,groups 用户名查指定用户,但要求调用者有权限读取/etc/passwd和/etc/group -
id -g返回主组 GID,id -G返回所有 GID 列表(数字形式),id -Gn是名称形式——注意后者在组名含非 ASCII 字符时可能截断或乱码 - 刚用
usermod -aG加组后,新组不会立刻出现在groups输出里——需重新登录或newgrp切换
过滤普通组和系统组的关键是 GID 范围
系统组(如 daemon、sys)通常 GID ≤ 999,普通用户创建的组 GID ≥ 1000。但这只是惯例,不是强制规则——有些发行版从 100 开始,有些容器镜像甚至全用 1–99。
安全起见,别硬编码 GID 边界。若需区分,优先查 /etc/login.defs 中的 GID_MIN 和 GID_MAX:
awk -F= '/^GID_MIN/ {print $2}' /etc/login.defs
再结合 awk -F: '$3 >= GID_MIN && $3 过滤。
-
getent group的 GID 是查询结果里的值,不受/etc/login.defs影响——网络目录可能返回任意 GID - 用
groupadd -g指定 GID 时,若该 GID 已被占用(即使对应组已删),会报错groupadd: GID 'xxx' already exists - 删除组后,GID 不会自动回收,新组默认使用下一个可用 GID(由
groupadd内部逻辑决定)
真正容易被忽略的是:/etc/group 文件本身没有锁机制,多进程同时写入可能损坏。脚本里用 echo ... >> /etc/group 是危险操作,必须用 groupadd / groupdel 等原子命令。










