Linuxでユーザーが所有していない空でないディレクトリを削除するにはどうすればよいですか?


10

ディレクトリ「foo」がユーザーAによって所有されており、ルートによって所有されるディレクトリ「bar」が含まれているrmdir場合、「foo」はユーザーAによって書き込み可能であるため、ユーザーA は論理的にでそれを削除できます。

ただし、ディレクトリ「bar」にルートが所有する別のファイルが含まれている場合、そのディレクトリ内のファイルを最初に削除する必要があるため、ディレクトリは削除できず、空になります。ただし、「bar」自体は書き込み不可であるため、その中のファイルを削除することはできません。

それを回避する方法はありますか?または、なぜそれが必要なのか私に納得させます。

回答:


7

解釈1:ディレクトリはファイルシステムのサブスペースです。そこにサブディレクトリを作成することにより、さらにサブサブスペースに分割できます。ディレクトリの所有者は、foo部分空間内のすべてのコントロールを持っている必要がありますfoo/barfoo/bar/quxなど

解釈2:ディレクトリはファイルシステムのサブスペースです。すべてのディレクトリは、その親と呼ばれる他のディレクトリに接続されています。ディレクトリの所有者はfoo、サブスペース内のすべてを制御できます。ただし、サブディレクトリのfoo/bar場合、の所有者は、にアタッチできるfooかどうかは制御barできますfooが、内部に入るものは制御できません。それを制御できるのbarはの所有者だけbarです。

解釈を支持する証拠2:すでに述べたように、権限の仕組み。また、一部のUnixファイルシステムでは、ディレクトリを複数の親に接続することができます。これは、複数のハードリンクを持つと呼ばれます。(通常のファイルでは複数のハードリンクを使用するのが一般的ですが、ディレクトリが祖父母のN回削除されるループを作成するリスクがあるため、通常はディレクトリの使用はお勧めできません。つまり、ルートからアクセスすることはできません。これは非常に一般的な期待です。ディレクトリにハードリンクが0であるが空ではない場合の対処方法の問題もあります。ディレクトリがアタッチされていないため、削除する必要がありますが、それをどうするか内容?)

解釈を支持する証拠1:実際には、ディレクトリには単一の親があり、ツリー構造を形成します。また、同様にfoo/bar/qux実行権限がない場合はアクセスできません(まあ、へのアクセスを許可されずにアクセスを許可する方法がややあいまいな場合があることを除いて)。したがって、上位レベルが重要です。foobarbarfoo

より実際的な注意として、あなたの状況では、ユーザーAは

mkdirガベージ
mv foo / bar garbage /
rmdir foo

1
これはすばらしい回答です(推奨)が、一貫性がないように見えるため、いらいらします。そして、バーをガベージに移動する実際の例は機能しますが、削除できないガベージというディレクトリが残ります。私はこれと同じ問題を抱えていますが、ユーザーAとユーザーBであることを除けば、BがAが所有するディレクトリで何かをスタックし、Aが削除したいと考えています。
ポールフーパー

これは良い説明ですが、mv問題を回避するために最後に使用した例は、Raspbianでは機能しません(他のシステムでは試していません)。さらに、この問題を調査したため、mv他で言及されている解決策としてのの使用を見たことがありません。実際、許可がどのように機能するかについての私の理解に基づいて、mv私がそれを試みたときに失敗することは理にかなっています。何か不足していますか?または、この機能はおそらく変更されましたか?@Gilles @PaulHooper
fvgs 2016

@fvgs何も変更されていませんが、状況によっては、これとは異なる権限が与えられている可能性があります。私はあなたが新しい質問をすることをお勧めします(この質問が現在SFで質問された場合、この質問はおそらくトピックから外れていると考えられるため、UnixとLinuxではServer Faultではありません)。
Gilles「SO-邪悪なことをやめなさい」

@ギレスあなたが説明した動作のドキュメント、リファレンス、または言及を私に教えてもらえますmvか?を使用mvして、barディレクトリの名前を変更できます。つまり、mvバーを現在のディレクトリの外または他のディレクトリに移動しない限り、は成功します。しかし、あなたが与えた例(バーをディレクトリを上に移動する)は私には機能しません(許可が拒否されました)。あなたが与えた例は、質問で指定されたもの以外の特定の条件を想定していますか?
fvgs 16

@fvgs私の例ではbar、ディレクトリを上に移動するのではなく、所有するディレクトリに移動します。garbage同じファイルシステムのどこにあってもかまいませんが、必ずしもその兄弟ではありませんfoo
Gilles「SO-邪悪なことをやめなさい」

0

これを回避する唯一の方法は、親ディレクトリでsetgidまたはsetuidを使用するか、ACLを使用することです。

ディレクトリsetgidを設定します

chmod g+s foo

デフォルトACLを設定します

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

これにより、このパスのデフォルトACLとして設定されます。このパスを含むファイルシステムをaclオプションでマウントする必要があります!

なぜこれが必要だと思うのか教えてください。


まあ、問題は一貫性の問題です。私が所有するディレクトリ内の別のユーザーが所有するファイルまたは空のディレクトリを削除することを妨げるものは何もありませんが、それが空でない場合、自分のディレクトリを削除することはできません。
Alex B

その場合は、指定したオプションの1つを使用します。彼らはあなたのためにうまく働きます。
wzzrd

デスクトップで複数のアカウントを使用することがよくあります(そのうちの1つは「メインの非root」アカウントです)。make installルートから始めて何かを構築し始めたときにも、このような状況が発生します。
Vi。

親ディレクトリのsetgidは役に立ちません。ルートとして実行した後cd ~user && mkdir qqq && touch qqq/qqqchmod g+s .とによってユーザーからqqqを取り除くことができませんrm -Rf qqq
Vi。

うーん。それはおそらくおそらくumaskの問題です。ディレクトリが775で、それがsetgidであり、umaskが0002の場合、ファイルはグループに対して書き込み可能であり、したがって、取り外し可能です。しかし、本当は、umask 0022(ほとんどがデフォルト)では機能しません。と言うべきだった。aclオプションをテストしましたか?
wzzrd
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.