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
。