我需要用干净的版本替换我的邮件文件(这台机器上的所有邮件都是监控 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
这是因为rm
(mv
以及类似的)涉及修改目录结构,除非您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
我认为这是因为当您移动或删除文件时,重要的权限是父目录的权限。由于移动文件意味着创建文件的副本并删除原始文件,因此您需要对目录拥有正确的权限才能执行此操作。在这种情况下,将您的用户添加到邮件组将为您提供这些必要的权限。