// 安全研究 · 2026-06-11

Linux 组管理命令工具链

引言

在 Linux 系统中,groups 命令是最常用的查看用户所属组的工具,但它只是组管理命令家族中的一员。实际上,围绕用户组的管理,Linux 提供了从查询、创建、修改到删除的完整命令体系。本文将系统性地介绍与 groups 相关的各类命令,帮助你全面掌握 Linux 组管理。


一、组查询类命令

这类命令用于查看用户和组的信息,是与 groups 功能最接近的工具。

1. groups——最直接的组查看工具

groups 命令用于显示用户所属的所有组,第一个显示的组是用户的主组(Primary Group),其余为附加组(Supplementary Groups)。

# 查看当前用户所属的组
groups

# 查看指定用户所属的组
groups username

输出示例:

alice : alice sudo developers www-data

2. id——获取详细身份信息

id 命令不仅显示组信息,还显示用户 ID(UID)、主组 ID(GID)等更详细的信息。

# 查看当前用户的完整身份信息
id

# 查看指定用户的信息
id username

# 仅显示组名称(最接近 groups 的输出格式)
id -Gn username

输出示例:

uid=1000(alice) gid=1000(alice) groups=1000(alice),27(sudo),1001(developers),33(www-data)

与 groups 的对比:

特性 groups id -Gn
输出格式 用户名 : 组1 组2 组3 组1 组2 组3
信息完整度 仅组名 可额外显示 UID/GID
灵活性 较低 高(多种选项组合)

3. getent——支持网络用户数据库

getent 命令从系统数据库(包括本地文件、NIS、LDAP 等)获取信息,在企业级环境中尤为重要。

# 查看所有组信息
getent group

# 查看特定组的信息
getent group groupname

# 查看特定用户所属的组(结合 grep)
getent group | grep "username"

与直接读取文件的区别:

  • cat /etc/group:仅读取本地文件,不支持网络用户数据库
  • getent group:统一查询本地文件、LDAP、NIS 等所有配置的用户源

4. /etc/group 和 /etc/gshadow——系统组文件

直接查看系统文件是最底层的方式,适用于脚本和深度排查。

# 查看所有组信息
cat /etc/group

# 查看指定组
grep "groupname" /etc/group

# 查看组密码信息(需要 root 权限)
sudo cat /etc/gshadow

/etc/group 文件格式:

组名:密码占位符:GID:成员列表

示例:

sudo:x:27:alice,bob
developers:x:1001:alice,carol

说明:

  • 密码字段通常为 x,表示密码存储在 /etc/gshadow 中
  • 成员列表用逗号分隔,不包含主组用户(主组用户不在该列表显示)

二、命令对比总览

flowchart TB
    subgraph Query[查询类命令]
        Q1[groups<br/>快速查看用户组]
        Q2[id<br/>查看 UID/GID 详情]
        Q3[getent<br/>支持 LDAP/NIS]
        Q4[cat /etc/group<br/>直接查看系统文件]
    end
    
    subgraph Create[创建类命令]
        C1[groupadd<br/>创建新组]
        C2[groupmod<br/>修改组属性]
        C3[groupdel<br/>删除组]
    end
    
    subgraph Member[成员管理命令]
        M1[usermod -aG<br/>添加用户到组]
        M2[gpasswd -a/-d<br/>添加/移除成员]
        M3[newgrp<br/>临时切换主组]
    end
    
    subgraph Ownership[权限管理命令]
        O1[chgrp<br/>更改文件属组]
        O2[chown<br/>更改文件所有者和属组]
    end
    
    Query --> Member
    Create --> Member
    Member --> Ownership

三、组创建与管理类命令

1. groupadd——创建新组

groupadd 用于向系统中添加新的用户组。

# 创建组,系统自动分配 GID
sudo groupadd developers

# 创建组并指定 GID
sudo groupadd -g 1500 developers

# 创建系统组(GID 范围 201-999)
sudo groupadd -r system-group

2. groupmod——修改组属性

groupmod 用于修改已有组的名称或 GID。

# 修改组名
sudo groupmod -n newname oldname

# 修改 GID
sudo groupmod -g 2000 groupname

注意事项:

  • 修改 GID 后,原本属于该组的文件仍持有旧的 GID,需要使用 find 命令重新分配
  • 修改组名会影响该组在权限配置中的所有引用

3. groupdel——删除组

groupdel 用于从系统中删除用户组。

# 删除组
sudo groupdel groupname

删除限制:

  • 如果该组是某个用户的主组,无法删除(需要先删除或修改该用户的主组)
  • 空组(无成员)可以直接删除

四、组成员管理命令

1. usermod——修改用户属性(包括组成员)

usermod 是最常用的用户修改命令,支持添加用户到附加组。

# 将用户添加到附加组(-a 表示追加,防止覆盖已有组)
sudo usermod -aG groupname username

# 同时添加到多个组
sudo usermod -aG group1,group2,group3 username

# 设置用户的主组
sudo usermod -g primarygroup username

警告: 忘记使用 -a(append)选项会覆盖用户的现有附加组,导致用户从其他组中移除。

2. gpasswd——管理组成员和组密码

gpasswd 专门用于组管理,功能比 usermod 更聚焦。

# 将用户添加到组
sudo gpasswd -a username groupname

# 从组中移除用户
sudo gpasswd -d username groupname

# 设置组密码(允许非成员临时加入)
sudo gpasswd groupname

# 设置组管理员
sudo gpasswd -A adminuser groupname

gpasswd 与 usermod 的对比:

操作 usermod gpasswd
添加用户到组 usermod -aG group user gpasswd -a user group
从组移除用户 不支持直接移除 gpasswd -d user group
批量操作 需多次执行 需多次执行
组密码管理 不支持 支持

3. newgrp——临时切换主组

newgrp 允许用户在当前会话中临时切换主组,类似于 su 但针对组身份。

# 切换到指定组(需要是组成员或有组密码)
newgrp groupname

# 使用 - 选项重置环境(类似重新登录)
newgrp - groupname

# 执行单条命令后退出(某些版本支持)
newgrp groupname -c "touch /shared/file"

使用场景:

  • 临时以其他组身份创建文件
  • 测试组权限配置
  • 团队协作中快速切换项目组

五、文件权限相关命令

1. chgrp——更改文件所属组

chgrp 用于修改文件或目录的组所有权。

# 更改文件的属组
chgrp developers file.txt

# 递归更改目录及其内容的属组
chgrp -R developers /project/

# 参考其他文件的属组进行更改
chgrp --reference=template.txt target.txt

2. chown——更改文件所有者和属组

chown 可以同时修改文件的所有者和所属组。

# 同时修改所有者和属组
chown alice:developers file.txt

# 仅修改属组(等同于 chgrp)
chown :developers file.txt

# 递归修改
chown -R alice:developers /project/

六、命令功能分类速查表

功能分类 命令 主要用途 是否需要 root
查询用户组 groups 快速查看用户所属组 否
id 查看 UID/GID 详细信息 否
getent group 查询组信息(支持 LDAP) 否
cat /etc/group 直接查看系统组文件 否
创建/修改/删除组 groupadd 创建新组 是
groupmod 修改组名或 GID 是
groupdel 删除组 是
组成员管理 usermod -aG 添加用户到附加组 是
gpasswd -a/-d 添加/移除组成员 是
newgrp 临时切换主组 否(需组成员)
文件权限 chgrp 更改文件属组 视文件所有权
chown 更改文件所有者/属组 视文件所有权

七、典型使用场景

场景一:查看用户组信息

# 简单查看
groups alice

# 详细查看
id alice

# 查看系统中所有组
getent group | less

场景二:创建新组并添加成员

# 1. 创建开发组
sudo groupadd -g 3000 developers

# 2. 添加用户到组
sudo usermod -aG developers alice
sudo gpasswd -a bob developers

# 3. 验证
groups alice

场景三:临时以其他组身份操作

# 切换到 developers 组创建文件
newgrp developers
touch shared-file.txt
exit

# 或者使用 sg 执行单条命令
sg developers -c "touch another-file.txt"

场景四:管理项目目录权限

# 创建共享目录并设置组
sudo mkdir /project
sudo chgrp -R developers /project
sudo chmod g+rwxs /project  # 设置 SGID 位,新文件继承组

总结

Linux 组管理命令体系十分丰富:

  • 查询层面:id 提供更多细节,getent 支持网络用户数据库,/etc/group 提供原始数据
  • 管理层面:groupadd、groupmod、groupdel 构成组的完整生命周期管理
  • 成员层面:usermod 和 gpasswd 负责组成员维护,newgrp 支持临时切换
  • 权限层面:chgrp 和 chown 将组概念延伸到文件系统

原文 https://blog.csdn.net/2301_79518550/article/details/161903613