如果用户A拥有目录“foo”并且包含由root拥有的目录“bar”,则用户A可以简单地使用rmdir将其移除,这是合乎逻辑的,因为用户A可以写入“foo”。
但是,如果目录“bar”包含另一个根文件,则目录不能被删除,因为它中的文件必须首先被删除,所以它变成了空的。 但“酒吧”本身是不可写的,所以不可能删除它的文件。
有没有办法解决它? 或者说服我,否则为什么这是必要的。
解释1:目录是文件系统的子空间。 它可以通过在其中创build子目录进一步细分为子空间。 foo目录的所有者应该可以控制子空间中的所有内容: foo/bar , foo/bar/qux等
解释2:目录是文件系统的子空间。 每个目录都附加到其他目录,称为其父目录。 目录foo的所有者控制子空间内的所有内容; 然而,对于foo/bar子目录, foo/bar的所有者可以控制bar是否可以附加到foo但不能控制bar内的内容:只有bar的所有者才能控制它。
有利于解释的证据2:正如你所指出的,权限的工作方式。 而且,一些Unix文件系统允许将一个目录连接到多个父节点:这被称为具有多个硬连接。 (对于普通文件来说,有多个硬链接是常见的,但是对于目录通常是不鼓励或者禁止的,主要是因为创build循环的风险,其中一个目录是自己的祖父母删除N次 – 所以你不能从根目录目录,这是一个非常普遍的期望,还有一个问题,如果一个目录有0个硬链接,但不是空的,该怎么办:由于该目录是独立的,你想删除它,但你如何处理内容?)
有利于解释的证据1:在实践中,目录确实有一个单一的父亲,因此形成了一个树形结构。 你不能访问foo/bar/qux除非你在foo和bar上都有执行权限(当然,除非有一些晦涩的方法来访问bar而不能访问foo )。 所以上层是重要的。
更实际一点,在你的情况下,用户A可以做
mkdir垃圾 mv foo / bar垃圾/ rmdir foo
唯一的方法是在父目录上使用setgid或setuid或使用ACL。
设置目录setgid
chmod g+s foo
在其上使用默认ACL
setfacl -d -R -mg:group:rwx foo
这将其设置为此path上的默认ACL。 您必须使用acl选项安装包含此path的文件系统!
现在告诉我你为什么想要这个。