为什么允许rm删除另一个用户拥有的文件?


52

为什么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>

我以为这不应该被允许。用户应该只能删除其所有权下的文件吗?有人可以阐明为什么允许这样做吗?以及如何避免这种情况?我可以认为仅限制父目录的写权限即可禁止意外删除文件。

Answers:


100

允许这样做的原因与删除文件的实际作用有关。从概念上讲,rm的工作是从目录中删除名称条目。如果这是文件的唯一名称,那么该文件可能随后变得不可访问,并且此时可以恢复该文件所占用的索引节点和空间这一事实几乎是偶然的。该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


6
使用目录上的粘滞位,您需要能够修改文件以允许将其删除。也就是说,如果文件与您属于同一组中的其他人,并且该组可以写入文件,则可以删除该文件。结论:任何人都可以删除具有公共写入权限的文件。(当然,所有内容都必须能够修改目录。)
Jonathan Leffler

1
我可能会误解您,但是您不是在说我可以-rw-rw-rw- 1 root root 0 Sep 1 11:11 /tmp/foo以我的普通用户身份(/tmp粘性)被删除,因为我可以写吗?但是我不能。
Celada's

4
我相信,如果您假设用户(不拥有文件的用户)创建了链接,则me/ you场景将成为更清晰的焦点。代词很难使用。假设Al创建了/home/al/file1,而具有执行(并可能读取)访问权限的Bob /home/al将该文件硬链接到/home/bob/als_file。如果鲍勃从移除链接防止创造出来的?/home/bob/als_file当  Al 没有写权限时,应该允许Al删除(取消链接)/home/bob吗?这条路导致混乱。
斯科特,

2
@JonathanLeffler:正如Scott的示例所示,不,当存在硬链接时,取消链接和截断不会得到相同的最终结果。
凯文(Kevin)

6
@Kevin我认为关键是,如果某人具有对该文件的写许可权,那么他可以销毁其内容,那么也可以允许他取消链接(假定他也对该目录具有写许可权)。反之则不适用-能够从一个目录中删除文件并不意味着他应该能够销毁内容,因为它们可以从另一个目录访问。这就是粘性位如何工作的逻辑。
Barmar 2015年

9

为了删除文件,您只需要能够写入文件所在的目录。

如果您不喜欢它,chmod +t dir则可以在最新操作系统中途设置“ sticky”位(此功能在1986年左右在SunOS中引入)。

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


9
请注意,要添加该t位,您需要拥有目录。而且,如果您拥有该目录,则无论是否t设置该位,都可以始终删除文件。如果将文件链接到其他人的目录,则应该为其他人准备好将其删除。一种替代方法是先创建您的子目录,然后在其中添加文件,因为如果子目录不为空,则所有者将无法删除该子目录。
斯特凡Chazelas

6
您以一种误导性的方式描述了这种情况。从技术上讲,文件不在目录中。而是文件的名称位于目录中,并且rm是对目录而不是文件的操作。删除文件的最后一个引用后,文件确实会被删除,但是从技术上讲,这是一个副作用。
reinierpost

0

逻辑类似于房屋:房主或房客决定将哪些客人扔出去,而不管谁是客人。同样,在另一所房子中受到欢迎的被驱逐的客人(在其他人的目录中具有另一个硬链接)也不会在外面死死。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.