如果目录“foo”归用户 A 所有,并且包含目录“bar”,而后者归 root 所有,则用户 A 可以简单地使用 将其删除rmdir
,这是合乎逻辑的,因为“foo”可由用户 A 写入。
但是如果目录“bar”包含另一个 root 拥有的文件,则无法删除该目录,因为必须先删除其中的文件,因此该目录将变为空目录。但是“bar”本身不可写,因此无法删除其中的文件。
有办法解决这个问题吗?或者,用其他方式说服我为什么这是必要的。
答案1
解释 1:目录是文件系统的子空间。可以通过在其中创建子目录将其进一步细分为子子空间。目录的所有者foo
应该可以控制子空间内的所有内容:foo/bar
、foo/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 选项挂载包含此路径的文件系统!
现在告诉我你为什么想要这个。