来自帖子为什么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
,请注意您实际上并未删除该文件。您只删除了一个链接。
请注意,如果在包含文件的目录上设置了粘滞位(如图所示t
)ls
,那么您做需要是文件的所有者才能删除它(除非您拥有该目录)。粘滞位通常设置为/tmp
。
答案2
为了取消链接文件,您只需要能够写入文件所在的目录即可。
如果您不喜欢这个,chmod +t dir
如果您使用的是较新的操作系统,则可以通过设置“粘性”位(此功能于 1986 年左右在 SunOS 中引入)。
如果您想要更细粒度,则需要具有现代 ACL 实现的文件系统(例如 ZFS)。基于 NTFS 的标准 NFSv4 ACL 包括对每个用户的文件特定删除权限的支持以及目录的“delete_child”权限。
答案3
其逻辑类似于房屋的逻辑:业主或租户决定扔掉哪些客人,无论客人是谁的。此外,被驱逐的客人在另一所房子里受到欢迎(在别人的目录中有另一个硬链接)不会在外面冻死。