我想将自己添加到“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 不属于。大多数事情并不关心帐户,而只关心执行操作的特定进程(有一些例外)。