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
。