Linux 系统中的分组命令是系统管理中非常重要的工具,主要用于对用户和用户组进行集中管理,从而简化权限控制、资源分配和安全策略的实施,在 Linux 中,用户组(Group)是一组用户的集合,通过将用户添加到不同的组中,可以实现对多个用户统一授权,例如允许某个组的用户访问特定目录、执行特定命令或使用特定设备,下面将详细介绍 Linux 中与分组管理相关的命令、配置文件及实际应用场景。

用户组的基本概念
Linux 系统中的每个用户都必须属于至少一个主组(Primary Group),同时可以属于多个附加组(Supplementary Groups),主组在创建用户时自动创建,与用户名同名,而附加组允许用户临时获得其他组的权限,用户组的配置信息主要存储在 /etc/group 文件中,该文件包含组名、组密码占位符(通常为 x,表示密码存储在 /etc/gshadow 中)、组 ID(GID)和组成员列表。
root:x:0:
sudo:x:27:alice,bob
developers:x:1000:charlie,david
developers 组的 GID 为 1000,成员包括 charlie 和 david。
常用的分组管理命令
groupadd:创建新组
groupadd 命令用于创建一个新的用户组,基本语法为 groupadd [选项] 组名,常用选项包括:
-g:指定 GID,避免系统自动分配。groupadd -g 2000 testgroup会创建 GID 为 2000 的testgroup。-r:创建系统组,GID 会自动选择小于 999 的值(具体取决于系统配置)。groupadd -r systemgroup会创建一个系统组。
groupmod:修改组属性
groupmod 命令用于修改已存在组的属性,语法为 groupmod [选项] 组名,常用选项:

-n:修改组名。groupmod -n newname oldname将oldname组重命名为newname。-g:修改 GID。groupmod -g 3000 developers将developers组的 GID 改为 3000。
groupdel:删除组
groupdel 命令用于删除已存在的组,语法为 groupdel 组名,需要注意的是,只有当该组没有作为任何用户的主组时才能删除,如果组中有用户作为附加组成员,则可以安全删除,但不会影响用户的附加组属性。groupdel testgroup 会删除 testgroup 组。
groups:显示用户所属组
groups 命令用于查看当前用户或指定用户所属的所有组。groups alice 会显示用户 alice 的主组和所有附加组。
gpasswd:管理组成员和密码
gpasswd 是组管理的核心命令,用于添加/删除组成员、设置组密码等,语法为 gpasswd [选项] 组名,常用选项:
-a 用户名:将用户添加到组中。gpasswd -a eve developers将eve添加到developers组。-d 用户名:从组中删除用户。gpasswd -d bob developers将bob从developers组移除。-M 用户列表:一次性设置组的所有成员(覆盖原有成员)。gpasswd -M "eve,frank" developers将developers组的成员设置为eve和frank。-A 用户列表:设置组管理员,允许管理员通过gpasswd管理组成员。gpasswd -A alice,frank developers将alice和frank设为developers组的管理员。-r:删除组密码(如果组设置了密码,用于newgrp命令切换组)。-R:禁止其他用户切换到该组。
newgrp:切换用户组
newgrp 命令允许用户临时切换到其他组,从而获得该组的权限,语法为 newgrp [组名]。newgrp developers 会将当前用户的组切换为 developers,但需要该组有密码或用户是组成员,切换后,新创建的文件默认属于 developers 组。

分组管理的实际应用场景
统一文件权限管理
假设有一个项目目录 /project/code,需要让开发团队的所有成员读写执行,而其他用户无权限,可以通过以下步骤实现:
- 创建
developers组:groupadd developers。 - 将开发团队成员添加到组:
gpasswd -a alice developers,gpasswd -a bob developers。 - 设置目录的组所有者:
chgrp developers /project/code。 - 设置目录权限:
chmod 2770 /project/code(2表示设置 setgid 位,使新文件继承目录的组所有者)。
限制命令执行权限
通过 sudo 配置,可以允许某个组的用户执行特定命令,在 /etc/sudoers 文件中添加:
%developers ALL=/usr/bin/systemctl restart nginx
这表示 developers 组的所有用户可以执行 systemctl restart nginx 命令。
磁盘配额管理
通过 setquota 命令,可以为某个组设置磁盘使用限制,限制 developers 组在 /home 分区最多使用 10GB:
setquota -g developers 10G 12G 0 0 /home
分组命令操作流程示例
以下是一个完整的分组管理操作流程,包括创建组、添加用户、修改组属性和删除组:
- 创建
project_team组并指定 GID:groupadd -g 1500 project_team。 - 将用户
user1和user2添加到组:gpasswd -a user1 project_team,gpasswd -a user2 project_team。 - 查看组成员:
grep project_team /etc/group,输出应为project_team:x:1500:user1,user2。 - 修改组名为
dev_team:groupmod -n dev_team project_team。 - 删除组:
groupdel dev_team。
常见问题与注意事项
- 无法删除组:如果删除组时提示
groupdel: cannot remove the primary group of user 'username',说明该组是某个用户的主组,需要先修改用户的主组(使用usermod -g 新主组 用户名)或删除用户(使用userdel -r 用户名)。 - 组密码的作用:组密码主要用于
newgrp命令,当用户需要切换到非主组且该组设置了密码时,需要输入密码,一般情况下,附加组无需设置密码,直接通过gpasswd添加用户即可。
相关问答FAQs
Q1:如何查看系统中所有组的列表?
A1:可以通过以下两种方式查看所有组:
- 查看
/etc/group文件:cat /etc/group,每行显示一个组的信息。 - 使用
getent命令:getent group,该方法会查询系统数据库(包括本地文件和远程服务如 LDAP),适用于复杂环境。
Q2:如何批量将多个用户添加到同一个组?
A2:可以通过以下两种方法实现:
- 使用
gpasswd的-M选项一次性设置组成员:gpasswd -M "user1,user2,user3" 组名,注意用户名之间用逗号分隔且无空格。 - 结合循环命令(如
for或while)逐个添加用户,for user in user1 user2 user3; do gpasswd -a $user 组名; done。
