Answers:
解释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垃圾桶/ rmdir foo
mv用来规避问题的示例在Raspbian上对我不起作用(尚未在其他任何系统上尝试过)。此外,在研究了这个问题之后,我还没有看到将其mv用作解决方案的其他地方。确实,基于我对权限的工作原理的理解,mv当我尝试执行权限失败时,这是有道理的。我想念什么吗?还是此功能可能已更改?@Gilles @PaulHooper
mv?我可以用来mv重命名bar目录。这意味着mv只要我不尝试将bar移出当前目录或其他任何目录,该成功就成功。但是您给出的示例(将目录移到目录上)对我不起作用(权限被拒绝)。您给出的示例是否假设问题中未指定其他特定条件?
bar目录上移,而是将其移动到您拥有的目录中。garbage可以位于同一文件系统上的任何位置,而不必是的同级对象foo。
解决此问题的唯一方法是在父目录上使用setgid或setuid或使用ACL。
用以下命令设置目录setgid
chmod g+s foo
在其上设置默认ACL
setfacl -d -R -m g:group:rwx foo
这将其设置为该路径上的默认ACL。您必须使用acl选项挂载包含此路径的文件系统!
现在告诉我为什么您认为自己想要这个。
make install从根开始构建某些东西时,我也会遇到这种情况。
cd ~user && mkdir qqq && touch qqq/qqq我无法通过chmod g+s .和摆脱用户的qqq rm -Rf qqq。