如何删除Linux中用户不拥有的非空目录?


10

如果目录“ foo”由用户A拥有并且包含目录“ bar”(该目录由root拥有),则用户A可以简单地使用rmdir逻辑删除它,因为“ foo”可由用户A写入。

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

有办法解决吗?或者,以其他方式说服我为什么有必要。

Answers:


7

解释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垃圾桶/
rmdir foo

1
这是一个很好的答案(已纠正),但是明显的不一致仍然让我感到沮丧。尽管将bar移至垃圾桶的实际示例确实可行,但我们留下了一个无法删除的名为垃圾桶的目录。除了用户A和用户B(其中B将某些内容粘贴在A拥有的目录中,A想要删除该目录)之外,我遇到了同样的问题。
Paul Hooper 2010年

这是一个很好的解释,但是最后一个mv用来规避问题的示例在Raspbian上对我不起作用(尚未在其他任何系统上尝试过)。此外,在研究了这个问题之后,我还没有看到将其mv用作解决方案的其他地方。确实,基于我对权限的工作原理的理解,mv当我尝试执行权限失败时,这是有道理的。我想念什么吗?还是此功能可能已更改?@Gilles @PaulHooper
fvgs

@fvgs没什么改变,但是您的情况可能与此权限不同。我建议您提出一个新问题(在Unix&Linux上而不是在Server Fault上,因为如果现在在SF上问这个问题,它可能会被认为是题外话),然后提供您情况的所有详细信息。
吉尔(Gilles)'所以

@Gilles能否请我指向一些文档,参考资料或提及您描述的行为mv?我可以用来mv重命名bar目录。这意味着mv只要我不尝试将bar移出当前目录或其他任何目录,该成功就成功。但是您给出的示例(将目录移到目录上)对我不起作用(权限被拒绝)。您给出的示例是否假设问题中未指定其他特定条件?
fvgs

@fvgs我的示例没有将bar目录上移,而是将其移动到您拥有的目录中。garbage可以位于同一文件系统上的任何位置,而不必是的同级对象foo
吉尔斯(Gillles)“所以-不再是邪恶的人”

0

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

用以下命令设置目录setgid

chmod g+s foo

在其上设置默认ACL

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

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

现在告诉我为什么您认为自己想要这个。


好吧,问题是一致性之一。没有什么可以阻止我删除我拥有的目录中的另一个用户拥有的文件或空目录,但是如果它不为空,那么我将无法删除自己的目录。
Alex B 2010年

如果是这样,我将使用提供的选项之一。他们会为您工作。
wzzrd 2010年

我经常在桌面上使用多个帐户(其中一个是“主要非root用户”帐户)。make install从根开始构建某些东西时,我也会遇到这种情况。
六。

父目录上的setgid无效。以root身份完成后,cd ~user && mkdir qqq && touch qqq/qqq我无法通过chmod g+s .和摆脱用户的qqq rm -Rf qqq
六。

嗯 那时,这可能是一个蒙面的事情。如果目录为775,则为setgid,而umask为0002,则文件对于组是可写的,因此对于您而言是可移动的。但是,确实如此,它不适用于umask 0022(大多数情况下是默认值)。应该说的。您是否测试过acl选项?
wzzrd 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.