为什么允许 rm 删除其他用户拥有的文件?

mtk*_*mtk 53 permissions history architecture rm files

来自帖子为什么 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>
Run Code Online (Sandbox Code Playgroud)

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

Cel*_*ada 103

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

而且,从目录中删除名称条目基本上是对该目录的操作,因此该目录是您需要具有写入权限的内容。


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

/home/me    # owned and writable only by me
/home/you   # owned and writable only by you
Run Code Online (Sandbox Code Playgroud)

并且有一个文件归我所有,并且有两个硬链接:

/home/me/myfile
/home/you/myfile
Run Code Online (Sandbox Code Playgroud)

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

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


请注意,如果粘位设置上包含文件(显示为目录tls),那么你这样做需要是文件的所有者才能被允许将其删除(除非你自己的目录)。粘滞位通常设置在 上/tmp

  • 使用目录上的粘滞位,您需要能够修改文件以允许将其删除。也就是说,如果该文件属于与您在同一组中的其他人,并且该组可能会写入该文件,则您可以删除该文件。推论:任何人都可以删除具有公共写入权限的文件。(当然,所有这些都以能够修改目录为条件。) (6认同)
  • @Kevin 我认为关键是如果有人对文件有写权限,那么他可以破坏内容,那么他​​也可以被允许取消链接(假设他也有对目录的写权限)。反过来不适用——能够从一个目录中删除文件并不意味着他应该能够销毁内容,因为它们可以从另一个目录访问。这就是粘滞位工作原理背后的逻辑。 (6认同)
  • 我相信如果您假设用户(不拥有该文件的人)创建了链接,那么`me`/`you` 场景就会更加清晰。代词很难使用;假设 Al 创建了 `/home/al/file1`,并且拥有对 `/home/al` 的执行(和可能读取)访问权限的 Bob,将该文件硬链接到 `/home/bob/als_file`。是否应该阻止 Bob 删除 **他** 创建的链接*?* 当 Al 没有对 `/home/bob 的写访问权限时,应该允许他删除(取消链接)`/home/bob/als_file` `?这条路导致混乱。 (4认同)
  • @JonathanLeffler:正如 Scott 的示例所示,不,当存在硬链接时,取消链接和截断 * 不* 具有相同的最终结果。 (2认同)

sch*_*ily 9

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

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

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

  • 请注意,要添加 `t` 位,您需要拥有该目录。如果您拥有该目录,则无论是否设置了 `t` 位,您都可以随时删除文件。如果您将文件链接到其他人的目录,您应该准备好让其他人能够删除它。另一种方法是首先创建您的子目录并在那里添加您的文件,因为如果该子目录不为空,所有者将无法删除该子目录。 (9认同)
  • 你以一种误导性的方式描述了这种情况。从技术上讲,文件不在目录中;相反,文件的名称在目录中,并且 `rm` 是对目录的操作,而不是对文件的操作。当最后一个引用被删除时,文件确实会被删除,但从技术上讲,这是一个副作用。 (6认同)