我不确定为什么以下内容会有不同的输出。我的理解是,未指定用户的组将赋予当前登录用户所属的所有组。
jacob@box:~$ groups
jacob adm lp dialout cdrom plugdev lpadmin sambashare
jacob@box:~$ groups jacob
jacob : jacob
另外,“当前进程的组”是什么意思(来自groups手册页)?他们在哪里设置?
注意:我的发行版是Ubuntu。
我不确定为什么以下内容会有不同的输出。我的理解是,未指定用户的组将赋予当前登录用户所属的所有组。
jacob@box:~$ groups
jacob adm lp dialout cdrom plugdev lpadmin sambashare
jacob@box:~$ groups jacob
jacob : jacob
另外,“当前进程的组”是什么意思(来自groups手册页)?他们在哪里设置?
注意:我的发行版是Ubuntu。
Answers:
可能是以下之一:
这些组在中设置/etc/group。
正如每个进程都具有当前的真实有效用户ID和真实有效的组ID一样,它也具有补充组列表。这些都是数字(不是名称),全部由内核维护。它们由登录过程(或显示管理器)在您登录时设置,就像您的用户ID一样。它们由子流程继承,就像您的用户ID一样。
当您groups不带任何参数运行时,它最终会调用getgroups()从内核获取补充组列表。(在我的Linux系统上,/ usr / bin / groups是一个运行“ id -Gn”的外壳程序脚本,该脚本随后又调用getgroups()。)
运行时groups username,该命令必须“猜测”该用户登录时的补充组。通常,通过读取/ etc / group或与NIS对话或与nscd或...对话来完成此操作。它可能有很多工作方式。
您正在观察的内容类似于发现您当前的实际用户ID与您在/ etc / passwd中的输入不一致。这意味着您的系统配置有些奇怪,但是如果不作进一步调查,很难说出什么。
(注:该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。
有关更多信息,请参见: