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

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

我想将自己添加到“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

我是否在“docker”组中?为什么groups $USER给出的结果与 不同groups

答案1

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

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

groups user1检查配置中表明用户是属于哪个成员。

因为您已添加user1到一个组并且尚未注销并重新登录,所以user1您登录时所属的组就是当前会话将使用的组。

希望有帮助

答案2

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

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

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

su(像和这样的用户切换工具sudo也做同样的事情,所以如果你急需对特定组执行某些操作,你可以“su”到 root,然后“su”回到你自己 - su 将重新初始化组列表作为其工作的一部分。你还会注意到,只有“su”运行的 shell 才有新组,而所有其他 shell 仍然显示旧组。)

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

相关内容