我更改了文件 ( chmod g+w testfile
) 的权限并运行ls -l testfile
给出:
-rwxrwxr-x 1 user1 user1 0 2011-01-24 20:36 testfile
然后我向该组添加了一个用户(“/etc/组" 有user1:x:1000:user2
行),但我无法以 user2 身份编辑该文件。为什么会这样?
答案1
user2
需要注销并重新登录。组权限的工作方式如下:
- 当您登录时,您的进程将拥有 中提到的主组
/etc/passwd
以及 中提到的您的用户的所有组中的组成员身份/etc/group
。 (更准确地说,pw_gid
领域在getpw(your_uid)
,加上所有团体其中您的用户是显式成员。除了/etc/passwd
和 之外/etc/group
,信息还可能来自其他类型的用户数据库,例如 NIS 或 LDAP。) 主组成为进程的有效组ID而其他组则成为其补充组 ID。 - 当进程执行需要某个组成员身份的操作时,例如访问文件,该组必须是进程的有效组 ID 或补充组 ID 之一。
正如您所看到的,您对用户组成员身份的更改仅在用户登录时生效。对于正在运行的进程来说,为时已晚。因此,用户需要注销并重新登录。如果这太麻烦,用户可以登录到单独的会话(例如,在不同的控制台上,或使用ssh localhost
)。
在幕后,一个进程只能失去权限(用户 ID、组 ID、功能)。内核启动init
以 root 身份运行的进程(启动后的第一个进程),并且每个进程最终都是该进程的后代。该login
进程(或sshd
,或让您登录的桌面管理器部分)仍在以 root 身份运行。它的部分工作是放弃 root 权限并切换到正确的用户和组。
有一个例外:执行setuid 或 setgid程序。该程序接收附加权限:它可以选择在父进程成员身份的各个子集以及拥有 setxid 可执行文件的用户或组中的附加成员身份下进行操作。特别是,setuid root 程序具有 root 权限,因此可以执行所有操作²;这就是程序喜欢su
并且sudo
能够完成其工作的方式。
1
偶尔会有一些进程不是从 init(initrd、udev)派生的,但原理是相同的:以 root 身份启动,并随着时间的推移失去特权。
²
禁止使用 SELinux 等多级安全框架。
答案2
您可能需要让 user2 注销并重新登录(或者只是尝试通过 ssh 登录来创建新的登录会话)。检查输出id --groups
以显示用户的数字组 ID。
答案3
sudo su $(whoami)
本质上与 相同的解决方法ssh localhost
,但无需安装 ssh 服务器即可使用。
只要你有root。但如果您刚刚添加了新组并更改了权限,则可能会这样做。
答案4
在某些情况下,如果您为主机使用 ControlMaster ssh 指令,则用户注销不会有帮助。如果您将帐户添加到组中,然后在同一 ControlMaster 连接中注销并再次登录,会话仍将显示没有新成员身份。您将不得不强行断开与Master的连接
ssh -O exit hostname
再次登录之前。