移动和删除 setguid 文件夹中的文件

移动和删除 setguid 文件夹中的文件

我需要用干净的版本替换我的邮件文件(这台机器上的所有邮件都是监控 cron 作业 - 因此没有理由不删除超过“n”天的邮件)。

该文件对我的用户帐户具有读/写权限,对任何其他用户或组均无权。它的组所有权是邮件组,因为 setguid 位是在 /var/spool/mail 上设置的。

我不是该邮件组的成员。

drwxrwsr-x 2 root mail 4096 9 月 2 日 15:17。
drwxr-xr-x 14 root root 4096 5月10日 09:27 ..
-rw------- 1 myuser 邮件 219722 9月 2 04:56 myuser

在我成为邮件组的成员之前,我无法移动或删除此文件。

我的问题是“为什么?”。为什么让我自己(我本人有读写此文件的权限)成为没有读写权限的组的成员会授予我移动和删除该文件的权限?

答案1

这是因为rmmv以及类似的)涉及修改目录结构,除非您w对该目录具有写()权限,否则您不能这样做。

这与相关文件的权限无关,您只需要对父目录有足够的权限。请注意,该rm操作实际上是unlink(2)系统调用,它只会将文件从目录的文件 inode 映射中取消链接。在mv同一个文件系统中执行时,rename(2)将执行将文件的 inode 映射到新目录。

因此,正如您所看到的,所有这些都需要修改父目录,而不管文件自己的权限如何,因此您需要w对目录具有权限才能重命名/删除/创建新文件。

现在,当在目录上设置 SETGID 位时,该目录上的所有文件都将归同一组(即该目录的所有者组)所有。

在您的情况下,/var/spool/mail目录的所有者具有root:mail权限775,并设置了 STDGID 位,这将使该目录下的所有文件都归同一组所有mail

因此,就目前情况而言,如果您想重命名/删除,myfile您需要对该/var/spool/mail目录具有足够的权限,root或者是该组的成员mail,如前所述,上的权限myfile在这里无关紧要。

答案2

我认为这是因为当您移动或删除文件时,重要的权限是父目录的权限。由于移动文件意味着创建文件的副本并删除原始文件,因此您需要对目录拥有正确的权限才能执行此操作。在这种情况下,将您的用户添加到邮件组将为您提供这些必要的权限。

相关内容