当您需要给予 Linux 用户访问 Docker、sudo、共享目录或其他受保护资源的权限时,通常会将该用户添加到某个组中。组允许您一次性管理多个用户的权限,而无需单独更改每个账户的权限。
本指南将解释如何将现有用户添加到 Linux 组、将用户添加到多个组、更改用户的主组,并验证更改是否已生效。
有两种类型的组:
- 主组 (Primary group):在创建账户时分配给用户。通常,主组的名称与用户名相同。当用户创建文件时,文件的所属组会被设置为该用户的主组。主组存储在
/etc/passwd文件中。 - 次级(补充)组 (Secondary (supplementary) groups):用于授予额外权限。例如,将用户添加到
docker组允许他们无需使用sudo即可运行 Docker 命令。
每个用户恰好有一个主组,可以属于零个或多个次级组。
只有 root 或拥有 sudo 权限的用户才能修改组成员资格。
快速参考
如需打印版快速参考,请参阅 useradd 速查表。
| 任务 | 命令 |
|---|---|
| 查看用户的组 | id username |
| 仅列出组名 | groups username |
| 列出所有系统组 | getent group |
| 列出组的成员 | getent group groupname |
| 检查用户是否存在 | getent passwd username |
| 检查组是否存在 | getent group groupname |
| 将用户添加到组 | sudo usermod -a -G groupname username |
| 将用户添加到多个组 | sudo usermod -a -G group1,group2 username |
| 将用户添加到组 (Debian, Ubuntu) | sudo adduser username groupname |
| 将您的账户添加到组 | sudo usermod -aG groupname $USER |
| 以新组启动 shell | newgrp groupname |
| 更改主组 | sudo usermod -g groupname username |
| 创建带有组的用户 | sudo useradd -g primary -G sec1,sec2 username |
| 将用户从组中移除 | sudo gpasswd -d username groupname |
| 创建组 | sudo groupadd groupname |
| 删除组 | sudo groupdel groupname |
显示用户组
在修改组之前,检查用户的当前组成员资格很有用。
id 命令显示用户的 UID、主组和所有次级组:
终端
id ggdoc输出
uid=1000(ggdoc) gid=1000(ggdoc) groups=1000(ggdoc),27(sudo),1001(developers)groups 命令仅打印组名:
终端
groups ggdoc输出
ggdoc: ggdoc sudo developers如果您省略用户名,两个命令都将显示当前登录用户的信息。
列出系统上的所有组
要列出系统上的所有组:
终端
getent group要列出特定组的所有成员:
终端
getent group docker输出
docker:x:993:deploy我们关于在 Linux 中列出组的指南涵盖了更多读取组成员资格的方法,包括直接读取 /etc/group。
将用户添加到组
在更改组成员资格之前,请确保用户和组都已存在。usermod 命令不会为您创建缺失的用户或组。
使用 getent passwd 检查用户:
终端
getent passwd ggdoc使用 getent group 检查组:
终端
getent group docker如果两个命令都返回条目,则可以将用户添加到组。
要将现有用户添加到次级组,请使用 usermod -a -G 命令,后跟组名和用户名:
终端
sudo usermod -a -G groupname username例如,要将用户 ggdoc 添加到 docker 组:
终端
sudo usermod -a -G docker ggdoc警告:始终使用 -a(追加)选项将用户添加到组。如果您省略 -a,用户将被从所有未列在 -G 选项之后的次级组中移除。
-a 和 -G 选项通常一起写作 -aG。这是同一命令的更短形式。
成功时,该命令不产生输出。使用 id 验证新的成员资格:
终端
id ggdoc输出
uid=1000(ggdoc) gid=1000(ggdoc) groups=1000(ggdoc),27(sudo),993(docker),1001(developers)组更改在用户注销并重新登录后生效。要在当前会话中应用更改,请运行:
终端
newgrp dockernewgrp 命令以所选组为活动组启动 shell。对于正常的登录会话,注销并重新登录是更干净的选择。
将用户添加到多个组
要一次性将用户添加到多个次级组,请用逗号(无空格)分隔组名:
终端
sudo usermod -a -G group1,group2,group3 username例如,要将 ggdoc 添加到 docker 和 developers 组:
终端
sudo usermod -a -G docker,developers ggdoc不要在逗号后加空格。usermod 期望一个逗号分隔的列表。
在 Debian 和 Ubuntu 上使用 adduser
Debian、Ubuntu 及其衍生版提供 adduser 命令。传递一个现有用户和一个现有组,它会将用户添加到该组:
终端
sudo adduser username groupname例如,要将 ggdoc 添加到 docker 组:
终端
sudo adduser ggdoc docker结果与 usermod -aG docker ggdoc 相同。没有需要记住的追加标志,因此您不会意外将用户从其他组中删除。
旧版本会打印简短确认信息。Ubuntu 26.04 和 Debian 13 提供 adduser 3.138 或更高版本。该版本将这些状态行保持在控制台之外。命令仍然成功。使用 id 验证结果:
终端
id ggdoc这种双参数形式属于 Debian 及其衍生版。在 Fedora、RHEL 及其衍生版上,adduser 是 useradd 的符号链接,因此在那里请使用 usermod。
将用户添加到 sudo 或 wheel 组
管理访问权限是更改用户组的最常见原因。组名取决于发行版。
在 Debian、Ubuntu 及其衍生版上,sudo 组的成员可以以 root 身份运行命令:
终端
sudo usermod -aG sudo ggdoc在 Fedora、RHEL 及其衍生版上,相同的权限来自 wheel 组:
终端
sudo usermod -aG wheel ggdoc两个组都从 /etc/sudoers 中的单个规则获取其权限。在 Debian 和 Ubuntu 上,该规则读取 %sudo ALL=(ALL:ALL) ALL,而在 Fedora 和 RHEL 上则读取 %wheel ALL=(ALL) ALL。百分号标记组规则而不是用户规则。
如果您不确定系统使用哪个组,请直接读取规则:
终端
sudo grep -E '^%(sudo|wheel)' /etc/sudoers用户必须在新的权限生效之前注销并重新登录。对于仅授予特定命令的规则,请参阅我们在 Ubuntu、Debian 和 CentOS 上向 sudoers 添加用户的指南。
更改用户的主组
要更改用户的主组,请使用 usermod 配合小写 -g 选项:
终端
sudo usermod -g groupname username例如,要将用户 ggdoc 的主组更改为 developers:
终端
sudo usermod -g developers ggdoc注意区别:-G(大写)设置次级组,-g(小写)设置主组。
创建带有组的用户
useradd 命令可以在创建新用户时分配主组和次级组:
终端
sudo useradd -g users -G wheel,developers nathan这创建了一个名为 nathan 的用户,其主组为 users,次级组为 wheel 和 developers。
从组中移除用户
要从组中移除用户,请使用带有 -d 选项的 gpasswd 命令:
终端
sudo gpasswd -d username groupname例如,要将 ggdoc 从 docker 组中移除:
终端
sudo gpasswd -d ggdoc docker创建和删除组
要创建一个新组:
终端
sudo groupadd groupname要删除一个组:
终端
sudo groupdel groupname您无法删除用户的初级组。请先更改用户的主组。
故障排除
组更改在当前 shell 中不生效
Linux 在会话启动时读取用户的组。如果 id username 显示新组但用户仍无法访问资源,请注销并重新登录。对于具有新组的临时 shell,运行 newgrp groupname。
usermod: user 'username' does not exist
用户名缺失或拼写不同。使用 getent passwd username 检查账户。如果需要先创建用户,请使用 useradd 或您发行版的用户管理工具。
usermod: group 'groupname' does not exist
在将用户添加到组之前,该组必须存在。使用 getent group groupname 检查它。如果缺失,请使用 sudo groupadd groupname 创建它,然后再次运行 usermod -a -G groupname username。
运行 usermod -G 后用户失去了对其他组的访问权限
当在不使用 -a 的情况下使用 -G 时会发生这种情况。该命令会用 -G 后面列出的组替换用户的次级组。使用 sudo usermod -a -G group1,group2 username 添加缺失的组,然后使用 id username 进行验证。
adduser username groupname 在 Fedora 或 RHEL 上失败
在 Fedora、RHEL 及其衍生版本中,/usr/sbin/adduser 是 useradd 的符号链接。该命令仅接受一个账户名称,因此会打印使用错误并且不会将用户添加到组。在这些系统上使用 sudo usermod -aG groupname username。
常见问题解答
如果我忘记在 usermod -G 中使用 -a 标志会发生什么?
用户将从除命令中列出的所有次级组中移除。这是管理组时最常见的错误。始终一起使用 -a -G。
组更改会立即生效吗?
不会。用户必须注销并重新登录才能使新组成员身份生效。您可以通过运行 id username 进行验证;更改会立即显示在那里,但用户的活动会话仍使用旧组。
-g 和 -G 在 usermod 中的区别是什么?
小写 -g 设置用户的主组。大写 -G 设置次级(补充)组。与 -a 一起使用时,-G 会追加到现有列表而不是替换它。
adduser 和 usermod 在组更改中的区别是什么?
在 Debian 和 Ubuntu 上,sudo adduser username groupname 一步将现有用户添加到现有组。usermod -aG groupname username 执行相同的操作并在每个发行版上工作。在基于 Debian 的系统上使用 adduser 进行交互式工作,并在脚本或 Fedora 和 RHEL 上使用 usermod。
如何将我的账户添加到组中?
使用 $USER 变量,这样您就不必键入用户名:sudo usermod -aG docker $USER。更改不会到达您所在的 shell。注销并重新登录,或使用 newgrp docker 启动新会话。
如何找出系统上存在哪些组?
运行 getent group 列出所有组,或运行 getent group groupname 检查特定组是否存在并查看其成员。
用户是否可以属于多个主组?
不行。每个用户恰好有一个主组。要授予对多个资源的访问权限,请使用次级组。