当您需要给予 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
以新组启动 shellnewgrp 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 docker

newgrp 命令以所选组为活动组启动 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 检查特定组是否存在并查看其成员。

用户是否可以属于多个主组?
不行。每个用户恰好有一个主组。要授予对多个资源的访问权限,请使用次级组。