要查看用户所属群组,应使用groups或id命令。1. 使用groups命令可直接列出用户所属的所有组,如groups username;2. 使用id命令能获取更全面的信息,包括uid、gid及所有组,如id username;3. 主组决定文件创建时的默认组,附加组用于扩展权限;4. 组变更后需重新登录或新开会话才能生效,因组信息在登录时缓存;5. 可通过usermod、gpasswd等命令管理用户和组,如usermod -ag添加用户到附加组,newgrp可临时启用新组权限。这些方法共同实现对用户权限结构的完整管理。

在Linux或Unix-like系统里,想知道一个用户到底归属于哪些群组,
groups和
id命令是你的左右手。它们能迅速揭示用户在系统中的权限结构,这在权限管理和故障排查时特别有用。
解决方案
要查看用户所属的组,最直接且常用的就是
groups和
id这两个命令。
groups命令用起来非常直观。如果你想查看当前登录用户所属的组,直接在终端输入:
groups
它会列出当前用户所加入的所有组名。比如,你可能会看到
youruser adm cdrom sudo dip plugdev lpadmin sambashare这样的输出。
如果你需要查看特定用户的组信息,只需在
groups后面加上用户名:
groups username
例如,要看
testuser的组,就输入
groups testuser。
而
id命令则提供了更详细的信息,我个人更偏爱它,因为它给的信息更全面,不仅仅是组,还有用户ID(UID)和主组ID(GID),这在很多时候能提供更细致的上下文。
不带任何参数执行
id,同样是查看当前用户:
id
输出通常是这样的格式:
uid=1000(youruser) gid=1000(youruser) groups=1000(youruser),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),119(lpadmin),128(sambashare)。这里清楚地显示了UID、主GID,以及所有附加组的ID和名称。
要查看特定用户的
id信息,也只需跟上用户名:
id username
比如,
id testuser。
id命令还有一些有用的选项,例如
id -un可以只显示用户名,
id -gn只显示主组名,
id -gn则只显示所有组名(和
groups命令类似,但
id -gn的输出通常更简洁,只列出名称)。
用户的主组和附加组有什么区别?
这块内容,我发现不少初学者会混淆,觉得只要在一个组里就行。但主组和附加组的差异,其实挺关键的。
每个用户在创建时都会被分配一个“主组”(Primary Group)。这个主组的ID就是
id命令输出中
gid后面跟着的那个。通常情况下,用户的主组会和用户名同名,比如用户
john的主组就是
john。当用户创建文件或目录时,如果没有特别指定,这些新创建的对象的默认所属组就是用户的主组。这意味着,主组在文件权限管理上扮演着一个默认的、基础性的角色。
而“附加组”(Supplementary Groups)则是用户除了主组之外,额外加入的其他组。一个用户可以同时属于多个附加组。这些附加组赋予用户访问特定资源或执行特定操作的权限。例如,用户加入
sudo组就能使用
sudo命令以root权限执行操作;加入
docker组就可以无需
sudo直接管理Docker容器。附加组的存在,主要是为了实现更灵活、更细粒度的权限控制,让用户能够根据工作需要获得不同的权限集合,而无需更改其主组。
简而言之,主组是用户身份的一部分,影响默认的文件创建行为;附加组则是用户额外获得的权限集合。
为什么有时groups命令的输出看起来不完整?
我遇到过不止一次这样的情况,明明把用户加到新组了,
groups一查,还是老样子。当时就纳闷了,后来才意识到是会话的问题。
当你通过
usermod -aG newgroup username这样的命令把一个用户加入到新的组之后,这个更改是即时生效在系统层面的。然而,用户当前正在运行的shell会话(或者说,当前的登录会话)并不会立即感知到这个变化。这是因为,当用户登录时,shell会读取用户的组信息并将其缓存起来。除非用户重新登录,或者启动一个新的shell会话,否则这个缓存的组信息不会更新。
所以,如果你刚刚把用户
testuser加到了
newgroup组,然后立即在
testuser当前登录的终端里执行
groups,你可能看不到
newgroup。正确的做法是让
testuser退出当前会话(比如注销再登录),或者简单地打开一个新的终端窗口(如果你的系统是图形界面),在新会话中执行
groups或
id,就能看到更新后的组信息了。
如果不想重新登录,但又想在当前会话中临时使用新组的权限,可以尝试使用
newgrp命令。例如,
newgrp newgroup。这会创建一个新的shell,其主组被临时设置为
newgroup,并且你也会拥有
newgroup的权限。但这种方式只是针对当前
newgrp创建的子shell有效,并非全局性的会话更新。
除了groups和id,还有哪些方式可以管理用户和组?
当然,光看是不够的,很多时候我们还需要修改用户或组的属性。说起来,这些命令其实都是在操作系统底层那些配置文件,比如
/etc/passwd、
/etc/group之类的。
要管理用户和组,我们主要会用到以下一些命令:
-
usermod
: 这是修改用户属性的瑞士军刀。你可以用它来将用户添加到新的附加组(usermod -aG newgroup username
),从组中移除用户(gpasswd -d username groupname
,或者更直接地,通过usermod -G
重新指定所有附加组),甚至更改用户的主组(usermod -g new_primary_group username
)。 -
useradd
: 用于创建新用户。在创建时,你就可以指定用户的主组和附加组,例如useradd -g primary_group -G supplementary_group1,supplementary_group2 username
。 -
userdel
: 删除用户。 -
groupadd
: 创建新的组。比如groupadd new_team
。 -
groupdel
: 删除组。注意,如果组里还有用户,通常不能直接删除,需要先将用户从组中移除。 -
gpasswd
: 这个命令主要用于管理组的密码以及组成员。除了上面提到的gpasswd -d
来删除组成员,你也可以用gpasswd -a username groupname
来添加用户到组。相比usermod -aG
,gpasswd -a
在某些场景下可能更便捷,因为它直接操作组本身。
这些命令共同构成了Linux/Unix系统用户和组管理的核心工具集,熟练掌握它们对于系统管理员来说是基本功。










