如何在 Linux 中删除不属于用户的非空目录?

如何在 Linux 中删除不属于用户的非空目录?

如果目录“foo”归用户 A 所有,并且包含目录“bar”,而后者归 root 所有,则用户 A 可以简单地使用 将其删除rmdir,这是合乎逻辑的,因为“foo”可由用户 A 写入。

但是如果目录“bar”包含另一个 root 拥有的文件,则无法删除该目录,因为必须先删除其中的文件,因此该目录将变为空目录。但是“bar”本身不可写,因此无法删除其中的文件。

有办法解决这个问题吗?或者,用其他方式说服我为什么这是必要的。

答案1

解释 1:目录是文件系统的子空间。可以通过在其中创建子目录将其进一步细分为子子空间。目录的所有者foo应该可以控制子空间内的所有内容:foo/barfoo/bar/qux等。

解释 2:目录是文件系统的一个子空间。每个目录都附加到某个其他目录,称为其父目录。目录的所有者foo可以控制子空间内的所有内容;但是,对于子目录foo/bar,的所有者foo可以控制是否bar可以附加到foo,但不能控制里面的内容bar:只有的所有者bar可以控制。

支持解释 2 的证据:正如您所指出的,权限的工作方式。此外,一些 Unix 文件系统允许目录附加到多个父级:这称为具有多个硬链接。(对于常规文件来说,具有多个硬链接很常见,但对于目录通常不鼓励或禁止这样做,主要是因为存在创建循环的风险,目录是其自己的祖父级 N 次移除 — 因此您无法从根目录访问它,这是一种非常常见的期望。还有一个问题是,如果目录有 0 个硬链接但不为空,该怎么办:由于目录未连接,您想删除它,但如何处理其内容?)

支持解释 1 的证据:实际上,目录确实只有一个父目录,因此形成树结构。foo/bar/qux除非您拥有 的执行权限foo以及 ,否则您无法访问bar(当然,除了有一些不太明显的方式可以在bar没有 访问权限的情况下获得 的访问权限foo)。因此,上层确实很重要。

更实际的是,在你的情况下,用户 A 可以

mkdir 垃圾
mv foo/bar 垃圾/
删除目录 foo

答案2

解决此问题的唯一方法是在父目录上使用 setgid 或 setuid 或者使用 ACL。

使用以下命令设置目录 setgid

chmod g+s foo

使用以下命令设置默认 ACL

setfacl -d -R -m g:group:rwx foo

这会将其设置为此路径上的默认 ACL。您必须使用 acl 选项挂载包含此路径的文件系统!

现在告诉我你为什么想要这个。

相关内容