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

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

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

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

jacob@box:~$ groups jacob
jacob : jacob

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

笔记:我的发行版是 Ubuntu。

答案1

它可能是下列之一:

  • 这可能是一个错误(尽管我对此表示怀疑)
  • 您可能需要注销并重新登录

组设置在 中/etc/group

答案2

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

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

主要组和补充组在登录时定义,并保留当前的。但是,用户可以随时更改其当前活动主要组 通过使用newgrp命令。

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

信息来源如下initgroups

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

groups命令将组显示为目前适用发送给您的用户,列表将以当前主要组随后是登录时的补充组。登录后对数据源的任何更改都不会反映在显示的列表中。

groups username命令要求 Linux计算该用户的组,它将主要使用文件/etc/password/etc/groups其他来源来执行此操作。这将反映系统文件的当前情况,可能不等于現有組从登录时起仍然有效。

如果命令groups username没有使用登录过程用于计算补充组的所有源,则可能会给出不同的结果,您的情况显然就是如此。这些源可能无法从您的登录名访问,或者可能只是未被命令参考。

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

虽然该groups命令给出了精确且正确的结果,但您已经很好地证明了groups username不能依赖该命令来执行相同的操作。

如果不检查命令的源代码groups,我猜想groups usernameLinux 发行版中命令的实现会分析/etc/groups,而 在您的情况下不包含任何内容,但不会使用/etc/nsswitch.conf,而 是您所有补充组的来源。因此仅列出了主组名称 jacob

更多信息请参阅:

答案3

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

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

当您运行时groups username,命令必须“猜测”该用户登录时的补充组是什么。它通常通过读取 /etc/group 或与 NIS 或 nscd 对话等来实现这一点......嗯,有很多方法可以实现它。

您观察到的情况类似于发现您当前的真实用户 ID 和 /etc/passwd 中的输入不一致。这意味着您的系统配置有些奇怪,但如果不进行进一步调查,很难说出是什么问题。

相关内容