我今天偶然发现了一个奇怪的行为。将用户添加到新组后,如下所示:
# gpasswd -a test myuser
groups
然后连接到新的 bash 会话,以下是和 的结果groups myuser
:
myuser@mycomputer$ groups
wheel myuser
myuser@mycomputer$ groups myuser
wheel myuser test
仅当我重新启动时, 的输出groups
才会与 相同groups myuser
,但不一定以相同的顺序显示组。
所以我的问题很简单:为什么?
答案1
因为对组成员身份的更改只有在启动新组后才会生效登录壳。启动新的非登录交互式 shell 会话(这是打开新终端时所得到的)是无关紧要的。
因此,当您运行 时groups
,会打印您的用户当前所在的组。但是,这些组是在您的用户首次登录时设置的,并且在您再次登录之前无法更改。因此,groups
不包括您的新组。
另一方面,当您运行 时groups myuser
,系统不会查找当前的用户属于眼下,它会查找用户所属的组myuser
,这是通过读取设置文件(/etc/group
大概是 )来获取的。由于您的用户被设置为属于 中的新组/etc/groups
,因此此命令也会显示这一点,即使您不是现在由于您尚未再次登录,因此已在该组中。
答案2
当您
groups
不带参数运行时,它会显示当前的组列表过程。通常,列表只是从父进程继承,但它被login
,newgrp
和类似的改变。当您
groups
使用参数运行时,它会显示为指定的(在用户数据库中)列出的组用户。这是login
下次为该用户运行时等将设置的组列表。
这就是为什么更新用户/组数据库只会影响未来登录会话 - 不要指望它会更改任何已在运行的进程。