如何将现有用户添加到现有组中?

我想将Apache用户(www-data)添加到audio组中。我已经阅读了useradd的手册,但是没有成功。我正在运行xubuntu 11.10。以下是我的操作步骤:
$ sudo useradd -G audio www-data
useradd: user 'www-data' already exists

如果我不加上-G选项,bash会打印出useradd的帮助信息。
$ sudo useradd  audio www-data
Usage: useradd [options] LOGIN
Options: -b, --base-dir BASE_DIR       base directory for the home directory...

从man页上对我来说不清楚应该使用哪些选项来使这个工作正常。
8个回答

使用useradd命令尝试添加一个新用户。由于您的用户已经存在,这不是您想要的。

相反地:要修改现有用户,例如将该用户添加到新组中,请使用usermod命令。

尝试这样做:

sudo usermod -a -G groupName userName
  • 使用-a(追加)开关是必要的。否则,用户将从任何不在列表中的组中删除。

  • -G开关接受一个(逗号分隔的)附加组列表,以分配给用户。

通常情况下(对于GUI或已运行的进程等),用户需要注销并重新登录才能看到他们新添加的组。对于当前的shell会话,您可以使用newgrp命令:

newgrp groupName
  • newgrp 将该组添加到当前的 shell 会话中。

82sudo usermod -a -G [group-name] [user-name]:对于那些只看标题就能得出答案的人来说,这只是一个简单的小技巧。 - Programster
2-a是做什么用的?它似乎已经过时/与之不兼容,但删除该命令后命令可以正常工作。我在几个版本的man手册中找不到相关参考...但是,在很多示例中我都看到了它-它到底是做什么用的? - wilhil
45我认为现在首选的方式是 sudo adduser user group。这种语法更简单、更清晰。请参考 @Bai 的回答。 - ctbrown
3@wilhil: man usermod: "-a, --append - 将用户添加到附加组中。仅与-G选项一起使用;**-G, --groups** GROUP1[,GROUP2,...[,GROUPN]]] [...] 如果用户当前是未列出的组的成员,则用户将从该组中移除。这种行为可以通过-a选项进行更改,该选项将用户追加到当前的附加组列表中。" - Adam Michalik
21有没有办法绕过“退出并重新登录”的部分?也许可以尝试一下更新组命令? - con-f-use
18@con-f-use,如果你可以运行sudo login -f YOURUSERNAME,它将启动一个新的shell会话。使用id命令验证新会话是否在正确的组中。然而,这并不是“全局”的-它不适用于已经打开的终端。所以,实际上,在可能的情况下,注销是最好的选择。 - Aaron McDaid
4你可以使用newgrp [group-name]命令在当前会话中为用户添加一个新的组,而无需重新登录。不过只有当前会话会受到影响。 - stenix
@AaronMcDaid,谢谢你的好建议!有些情况下无法注销登录,而你的建议帮我避免了一些麻烦! - russoue
@con-f-use: 我认为 su - USERNAME 将直接激活一个新的 shell,并使新的组设置可用。根据文档:SYNOPSYS: su [选项] [-] [用户 [参数...]]。DESCRIPTION su 允许使用替代的用户和组 ID 运行命令。-login 参数的简写形式。 - klaas
newgrp命令不会将组添加到当前的shell会话中。newgrp命令为当前会话设置用户的主要组。注销并重新登录会更新次要组列表 - 它不会修改主要组,因此使用newgrp命令不能替代注销并重新登录。如果您想要一个替代注销并重新登录的方法,请尝试使用exec sg <groupName> newgrp,例如exec sg audio newgrp。更多信息请参考这里。希望对您有所帮助。 - jaimet

将用户添加到组中:
sudo adduser user group

从一个群组中移除用户:
sudo deluser user group

5不完全是这个问题所要求的 - Tejendra
17@Tejendra的评论似乎假设使用useradd是回答OP问题时值得/强制要求的;也许这个回答只是缺少表明adduser/deluser是更好的选择的字词。 - sage
16对我来说,简单的界面更好,这就是为什么我喜欢这个。 - Betlista
这是特定于Debian/Ubuntu的吗? - knocte
5这确切地就是被问到的问题。@knocte,是的,我认为这是特定于Debian的。 - Auspex
3@Auspex 我可以确认它在 Red Hat 上不起作用。 - Stibu

添加到现有用户后:
usermod -a -G group user  

你可能需要注销并重新登录,以获取来自/etc/group的组权限。

FYI:我认为id命令应该能够在不需要退出的情况下显示您已被添加到组中。id myuser - ficuscr
6在Ubuntu 14.10上,我需要退出并重新登录。 - Adam D.

我通常使用
sudo gpasswd -a myuser mygroup

3usermod在我的Ubuntu 14.04系统上不可用。这个方法很有效! - Drew
这在Debian Stretch上也非常有效,因为usermod没有安装。 - vhs
记得注销并重新登录。 - Flimm

我发表这个回答是因为我的声望还不够高,无法进行评论。正如@dpendolino所提到的,要使此命令的效果持久化,您需要注销/登录一次。
然而,如果您需要立即开始使用新的组成员身份(并且具有正确的sudo权限),我找到了一个解决方法:
$ sudo su -
# su [userName]
$ groups

解释:

  • sudo su - 将给你一个 root shell
  • su [用户名] 会将你返回到一个带有你的用户的 shell
  • groups 现在运行时将显示你使用 usermod -aG 命令添加的组

在我的情况下,我试图将 'docker' 组添加到我的用户中

之前:

$ groups
userName adm cdrom sudo dip plugdev lpadmin sambashare wireshark lxd

之后:

$ groups
userName adm cdrom sudo dip plugdev lpadmin sambashare wireshark lxd docker

另一种应用组成员身份的选项是 sudo login -f <username>,正如Aaron McDaid在另一个答案中的评论所述。 - David Oliver

sudo usermod -a -G groupName userName

会正常工作,但我不得不重新启动整个系统,仅仅注销然后重新登录并不能完成任务...


我也发现了这个问题,不知道是不是因为我在使用Wayland。 - Flimm

在Ubuntu上,由于未启用以root身份登录, 属于sudo组的用户可以提升特定受限命令的权限。任何受限命令都必须在前面加上sudo来提升权限。
sudo usermod -a -G group user

将现有用户user添加到一个名为group的附加组中。用户的主要组将保持不变。

要将用户永久添加到一个组中,请运行以下命令:

sudo usermod -a -G <groupname> <username>

然后退出并重新登录(或者如果需要的话,重新启动)。
解释: usermod命令将修改/etc/group文件,在与该组相关的行中列出指定的用户名。如果运行grep <groupname> /etc/group,您应该在输出中看到您的用户名。
在Linux中,每个进程都被分配给一个用户和一些组,并且任何子进程都会继承父进程的用户和组。因此,为了使这个更改生效并传播,您需要退出并重新登录(此时会读取和使用/etc/group)。在Wayland上,我发现需要完全重新启动。
如果运行命令groups,您可以查看当前进程是否具有预期的组。