为什么允许 rm 删除不同用户所有权下的文件?

为什么允许 rm 删除不同用户所有权下的文件?

来自帖子为什么rm可以删除只读文件?据我所知,rm只需要目录的写权限即可删除文件。但我发现很难理解我们可以轻松删除所有者和组不同的文件的行为。

我尝试了以下方法

mtk :我的用户名
abc :创建了一个新用户

$ ls -l file
-rw-rw-r-- 1 mtk mtk       0 Aug 31 15:40 file
$ sudo chown abc file
$ sudo chgrp abc file
$ ls -l file
-rw-rw-r-- 1 abc abc       0 Aug 31 15:40 file
$ rm file
$ ls -l file
<deleted>

我想这不应该被允许。用户应该只能删除他拥有的文件吗?有人可以阐明为什么允许这样做吗?避免这种情况的方法是什么?我可以认为只有限制父目录的写入权限才能禁止意外删除文件。

答案1

允许这样做的原因与删除文件的实际作用有关。从概念上讲,rm的工作是从目录中删除名称条目。如果这是文件的唯一名称,那么该文件可能会变得无法访问,因此此时可以恢复文件占用的 inode 和空间,这一事实几乎是偶然的。该命令调用的系统调用的名称rm(即 )unlink甚至暗示了这一事实。

并且,从目录中删除名称条目基本上是一个操作在该目录上,所以该目录就是您需要有写入权限的目录。


下面的场景可能会让你感觉更舒服一些?假设有目录:

/home/me    # owned and writable only by me
/home/you   # owned and writable only by you

有一个属于我的文件,其中有两个硬链接:

/home/me/myfile
/home/you/myfile

不要介意这个硬链接/home/you/myfile最初是如何到达那里的。也许root把它放在那里。

这个例子的想法是应该允许您删除硬链接/home/you/myfile。毕竟很乱你的目录。应该能够控制内部存在和不存在的内容/home/you。当您执行删除时/home/you/myfile,请注意您实际上并未删除该文件。您只删除了一个链接。


请注意,如果在包含文件的目录上设置了粘滞位(如图所示tls,那么您需要是文件的所有者才能删除它(除非您拥有该目录)。粘滞位通常设置为/tmp

答案2

为了取消链接文件,您只需要能够写入文件所在的目录即可。

如果您不喜欢这个,chmod +t dir如果您使用的是较新的操作系统,则可以通过设置“粘性”位(此功能于 1986 年左右在 SunOS 中引入)。

如果您想要更细粒度,则需要具有现代 ACL 实现的文件系统(例如 ZFS)。基于 NTFS 的标准 NFSv4 ACL 包括对每个用户的文件特定删除权限的支持以及目录的“delete_child”权限。

答案3

其逻辑类似于房屋的逻辑:业主或租户决定扔掉哪些客人,无论客人是谁的。此外,被驱逐的客人在另一所房子里受到欢迎(在别人的目录中有另一个硬链接)不会在外面冻死。

相关内容