如果我当前以用户身份登录,为什么 `groups` 的输出与 `groups user` 不同?

Jak*_*ake 26 linux user-accounts permissions ubuntu

我不确定为什么以下有不同的输出。我的理解是,没有指定用户的组给出了当前登录用户所属的所有组。

jacob@box:~$ groups
jacob adm lp dialout cdrom plugdev lpadmin sambashare

jacob@box:~$ groups jacob
jacob : jacob
Run Code Online (Sandbox Code Playgroud)

另外,“当前进程的组”是什么意思(来自组手册页)?他们在哪里设置?

注意:我的发行版是 Ubuntu。

小智 13

它可能是以下之一:

  • 这可能是一个错误(虽然我怀疑)
  • 您可能需要注销并重新登录

组设置在/etc/group.


Nem*_*emo 8

正如每个进程都有一个当前真实有效的用户 ID 和真实有效的组 ID 一样,它也有一个补充组列表。这些都是由内核维护的数字(不是名称)。它们由登录过程(或显示管理器)在您登录时设置,就像您的用户 ID 一样。它们由子进程继承,就像您的用户 ID 一样。

当您groups不带参数运行时,它最终会调用getgroups()从内核获取补充组列表。(在我的 Linux 系统上,/usr/bin/groups 是一个运行“id -Gn”的 shell 脚本,它依次调用 getgroups()。)

当您运行 时groups username,该命令必须“猜测”该用户登录时的补充组是什么。它通常通过阅读 /etc/group 或与 NIS 交谈或与 nscd 交谈或...它可能有很多工作方式。

您观察到的情况类似于发现您当前的真实用户 ID 与您在 /etc/passwd 中的条目不一致。这意味着您的系统配置有些奇怪,但如果没有更多调查,很难说是什么。


har*_*ymc 8

(备注:该groups命令虽然仍然有用,但大部分已被id 命令取代。)

用户有一个主要组,传统上在/etc/passwd他登录时使用的文件文件中定义 ,但今天可能有其他来源。他也可能是其他组的成员,称为辅助组或补充组,传统上在文件中指定/etc/groups,但今天也可以来自其他来源或由其他来源(例如 NIS、LDAP、SAMBA 等)暗示。

主要和补充组在登录时定义并保持最新状态。但是,用户可以随时 使用该命令更改其当前活动的主要组newgrp

登录过程设置主要和补充组。对于后者,它通常调用 libc 函数initgroups,该函数 编译补充组数据列表并将其传递给 setgroups函数,后者在进程的上下文中建立它。

信息来源为initgroups

GNU C 库和某些其他应用程序使用它来确定从哪些来源获取一系列类别的名称服务信息,以及以什么顺序。每个类别的信息都由一个数据库名称标识。

groups命令显示当前应用于您的用户的组,列表将从当前的主要组开始,然后是从登录时开始的补充组。登录后对数据源的任何更改都不会反映在显示的列表中。

groups username命令要求Linux来计算该组的用户,它将用做主要文件/etc/password ,并/etc/groups再额外来源。这将反映系统文件的当前情况,并且可能不等于从登录时起仍然有效的当前组

当该groups username命令不使用登录过程用于计算您的补充组的所有来源时,该命令可能会给出不同的结果,这在您的案例中显然发生了。这些资源可能无法通过您的登录访问,或者命令可能无法查询。

使用该id username命令可能会得到更好的结果,但也不能保证像登录过程那样完整。该id命令比旧groups命令更新,并且旨在比旧命令更精确。

虽然该groups命令给出了精确和正确的结果,但您已经很好地证明了groups username不能依赖该命令来做同样的事情。

在不检查groups命令的源代码的情况下,我猜测该groups username命令在您的 Linux 发行版中的实现分析/etc/groups,在您的情况下,它不包含任何内容,但不使用/etc/nsswitch.conf,您的所有补充组都来自它。因此仅列出主要组名, jacob

有关更多信息,请参阅: