当您运行,它查找1在给定的用户和(虽然它可以是LDAP,NIS或别的东西2),并显示你所有的研究小组发现。groups username
/etc/passwd
/etc/group
另一方面,在groups
不带任何参数的情况下运行命令时,它仅列出其本身属于3的所有组– 不一定与中列出的组相同/etc/group
。(请参阅下面的说明。)实际上,唯一要进行的查找/etc/group
是将GID转换为组名。
每个进程都有一组凭据,其中包括(除其他事项外)“真实组ID”(主要GID),“有效组ID”(EGID)和“补充组” ID(辅助GID)列表。默认情况下,进程从其父级继承其凭据。但是,CAP_SETUID
允许以root用户身份(UID 0)运行或具有该功能的进程设置任意凭据。
特别是,当您登录Linux(无论是使用tty,X11还是通过SSH)时,登录过程(/ bin / login,gdm,sshd)都会查询您的用户名,以确定您的UID,主GID和辅助GID。 。在个人计算机上,这仅意味着从passwd
和group
文件(或NIS,LDAP等)中读取相应的行。
接下来,登录进程切换4到这些凭据启动会话之前,每一次你从现在开始发动对过程有相同的UID和GID的-该系统不检查/etc/group
了5并不会拿起所做的任何修改。
这样,该/usr/bin/groups
进程将与您登录时所属于的组属于同一组,而不是数据库说您所在的组。
注意:上面的解释也适用于几乎所有的Unix。到Windows NT家族(除了UID和GID都被称为“ SID”,没有“主要组”,凭据被称为“进程令牌”,并且CAP_SETUID
是SeCreateTokenPrivilege或SeTcbPrivilege);并可能适用于大多数其他多用户操作系统。
1 getpwuid()和getgrouplist()用于查找用户的组。
2在Linux上,glibc用于/etc/nsswitch.conf
确定在何处查找此信息。
3 groups
使用getgid(),getegid()和getgroups()获得自己的凭据。
4 setuid(),setgid(),initgroups()及其相关。
5例外,当然,是运行升高(各种工具的setuid),诸如su
,sudo
,sg
,newgrp
,pkexec
,等。这意味着su $USER
将生成具有更新的组列表的外壳。