是什么使得新的组成员身份需要新的登录名(或由su
或启动的新登录 shell newgrp
)才能可见?
仅运行另一个 bash (或任何其他 shell)实例是--login
行不通的,但是像 su 或 newgrp 这样的 suid root 的东西可以工作。
是否有从父 shell 继承或缓存的内容隐藏了新的组成员身份?
答案1
创建子进程时,进程用户 ID 和组 ID 继承自其父进程。
因此,当您更改用户组(实际上是更改磁盘上某处的配置文件)时,进程不会自动注意到它并更改其组 ID(非 root 进程无论如何都没有权限)。
当你启动 bash 时......好吧,你只是启动 bash,没有什么特别的事情发生。它只是继承父级(可能是图形 shell 或其他 bash)的组 ID。
但是当你运行 su 或登录时,所有的魔法都会发生。他们检查是否允许您登录并更改他们的用户 ID 和组 ID(顺便说一句,使用需要有效根 ID 的系统调用 - 这就是他们设置 suid 位的原因),以便他们的所有子进程继承这些 ID。