为什么“groups”和“groups $USER”给出不同的结果?

Gro*_*llo 18 linux user-groups

我想将自己添加到“docker”组。这些是我运行的命令及其输出:

user1@laptop-p3510:~$ sudo usermod -a -G docker user1
user1@laptop-p3510:~$ groups
user1 adm cdrom sudo dip plugdev lpadmin lxd sambashare
user1@laptop-p3510:~$ whoami
user1
user1@laptop-p3510:~$ groups user1
user1 : user1 adm cdrom sudo dip plugdev lpadmin lxd sambashare docker
Run Code Online (Sandbox Code Playgroud)

我是否属于“docker”组?为什么会groups $USER给出不同的结果groups

小智 37

因为您需要注销并重新登录才能使添加的组处于活动状态。

groups返回当前会话中您所属的组

groups user1检查配置显示该用户所属的内容。

由于您已添加user1到组并且尚未注销并再次登录,user1因此当前会话将使用您登录时所属的组。

希望有帮助

  • 是的,就是这样。谢谢你!我感觉自己就像在海绵宝宝“那不是我的钱包”模因中。 (7认同)

use*_*686 11

与 UID 和 GID 一样,组是每个进程的凭据。每个进程都有自己所属的组列表,该列表在登录时从 /etc/group 初始化(由处理登录的初始进程),但在其他情况下从父进程继承。

\n

因此,当您从 shell 运行时groups,它会从 shell 继承组列表(shell 从终端应用程序等继承它们),这就是它显示的列表。这同样适用于 所示的 UID 和 GID id(实际上也适用于 所示的环境变量env)。当 /etc/group 更新 \xe2\x80\x93 时,此列表不会自动更改,直到您下次登录为止。

\n

另一方面,运行groups SomeUserid SomeUser会要求程序直接从 /etc/group 读取组信息(与登录过程相同),因此它自然会为您提供更新的列表。

\n

(用户切换工具类似susudo也做同样的事情,所以如果您迫切需要对特定组执行某些操作,您可以“su”到 root,然后“su”回到您自己 \xe2\x80\x93 su 将重新初始化该组列出作为其工作的一部分。您还会注意到,只有“su”运行的 shell 具有新组,而所有其他 shell 仍然显示旧组。)

\n

要回答这个问题,是的,您的帐户位于“docker”组中,但您运行“组”的特定 shell 不在其中。大多数事情并不关心帐户,而只关心执行操作的特定进程(有一些例外)。

\n