Wie entferne ich ein nicht leeres Verzeichnis, das dem Benutzer unter Linux nicht gehört?

10

Wenn ein Verzeichnis "foo" Benutzer A gehört und ein Verzeichnis "bar" enthält, das root gehört, kann Benutzer A es einfach mit entfernen rmdir, was logisch ist, da "foo" von Benutzer A beschreibbar ist.

Wenn das Verzeichnis "bar" jedoch eine andere Root-Datei enthält, kann das Verzeichnis nicht entfernt werden, da die darin enthaltenen Dateien zuerst entfernt werden müssen, damit es leer wird. "Bar" selbst ist jedoch nicht beschreibbar, sodass es nicht möglich ist, darin enthaltene Dateien zu entfernen.

Gibt es einen Weg, um das zu umgehen? Oder überzeugen Sie mich anders, warum es notwendig ist.

Alex B.
quelle

Antworten:

7

Interpretation 1: Ein Verzeichnis ist ein Unterraum des Dateisystems. Es kann weiter in Unterbereiche unterteilt werden, indem darin Unterverzeichnisse erstellt werden. Der Besitzer des Verzeichnisses foosoll innerhalb der Subraum Kontrolle über alles hat: foo/bar, foo/bar/quxusw.

Interpretation 2: Ein Verzeichnis ist ein Unterraum des Dateisystems. Jedes Verzeichnis ist an ein anderes Verzeichnis angehängt, das als übergeordnetes Verzeichnis bezeichnet wird. Der Eigentümer des Verzeichnisses foohat die Kontrolle über alles im Unterraum. Bei einem Unterverzeichnis foo/barhat der Eigentümer von foojedoch die Kontrolle darüber, ob barer an das foo, was sich darin befindet, angehängt werden kann, aber nicht darüber. barNur der Eigentümer von barhat die Kontrolle darüber.

Beweise für Interpretation 2: Wie Sie bemerkt haben, die Art und Weise, wie Berechtigungen funktionieren. Auch die Tatsache, dass einige Unix-Dateisysteme das Anhängen eines Verzeichnisses an mehr als ein übergeordnetes Verzeichnis ermöglichen: Dies wird als mehrere feste Links bezeichnet. (Bei normalen Dateien ist es üblich, mehrere feste Links zu haben, bei Verzeichnissen wird dies jedoch normalerweise nicht empfohlen oder verboten, hauptsächlich wegen des Risikos, Schleifen zu erstellen, bei denen ein Verzeichnis von seinen Großeltern N-mal entfernt wird. Sie können also nicht vom Stammverzeichnis darauf zugreifen Verzeichnis, was eine sehr häufige Erwartung ist. Es gibt auch das Problem, was zu tun ist, wenn ein Verzeichnis 0 feste Links hat, aber nicht leer ist: Da das Verzeichnis nicht angehängt ist, möchten Sie es löschen, aber was tun Sie damit? Inhalt?)

Beweis für Interpretation 1: In der Praxis haben Verzeichnisse einen einzigen Elternteil und bilden so eine Baumstruktur. Und Sie können nicht darauf zugreifen, es foo/bar/quxsei denn, Sie haben die Ausführungsberechtigung foofür bar(naja, außer dass es etwas undurchsichtige Möglichkeiten gibt, Zugriff zu erhalten, barohne Zugriff zu erhalten foo). Die oberen Ebenen spielen also eine Rolle.

Praktischer gesagt, in Ihrer Situation kann Benutzer A dies tun

mkdir Müll
mv foo / bar müll /
rmdir foo
Gilles 'SO - hör auf böse zu sein'
quelle
1
Dies ist eine großartige Antwort (zurückgenommen), aber die offensichtliche Inkonsistenz bleibt für mich frustrierend. Und während das praktische Beispiel für das Verschieben von Balken in Müll funktioniert, bleibt ein Verzeichnis namens Müll übrig, das nicht entfernt werden kann. Ich habe das gleiche Problem, außer dass es Benutzer A und Benutzer B sind, bei denen B etwas in ein Verzeichnis von A gesteckt hat, das A entfernen möchte.
Paul Hooper
Dies ist eine gute Erklärung, aber das Beispiel am Ende, mit mvdem das Problem umgangen wird, funktioniert bei Raspbian nicht (habe es auf keinem anderen System versucht). Nachdem ich dieses Problem untersucht habe, habe ich die Verwendung mvals eine Lösung gesehen, die nirgendwo anders erwähnt wurde. Aufgrund meines Verständnisses der Funktionsweise der Berechtigungen ist es in der Tat sinnvoll, dass das mvfehlschlägt, wenn ich es versucht habe. Vermisse ich etwas Oder hat sich diese Funktionalität vielleicht geändert? @ Gilles @ PaulHooper
fvgs
@fvgs Nichts hat sich geändert, aber Ihre Situation hat möglicherweise andere Berechtigungen als diese. Ich schlage vor, dass Sie eine neue Frage stellen (unter Unix und Linux anstelle von Serverfehler, da diese Frage wahrscheinlich als nicht zum Thema gehörend angesehen wird, wenn sie jetzt auf SF gestellt wird) und alle Details Ihrer Situation angeben.
Gilles 'SO - hör auf böse zu sein'
@ Gilles Könnten Sie mich bitte auf eine Dokumentation, einen Verweis oder eine Erwähnung des von Ihnen beschriebenen Verhaltens verweisen mv? Ich kann mvdas Balkenverzeichnis umbenennen. Das bedeutet, dass dies mverfolgreich ist, solange ich nicht versuche, die Leiste außerhalb des aktuellen Verzeichnisses oder in ein anderes Verzeichnis zu verschieben. Aber das Beispiel, das Sie gegeben haben (das ein Verzeichnis nach oben verschiebt), funktioniert bei mir nicht (Berechtigung verweigert). Nimmt das von Ihnen angegebene Beispiel andere als die in der Frage angegebenen Bedingungen an?
fvgs
@fvgs In meinem Beispiel wird barein Verzeichnis nicht nach oben verschoben , sondern in ein Verzeichnis, das Sie besitzen. garbagekann überall auf dem gleichen Dateisystem sein, nicht unbedingt ein Geschwister von foo.
Gilles 'SO - hör auf böse zu sein'
0

Die einzige Möglichkeit, dies zu umgehen, besteht darin, entweder eine setgid oder eine setuid im übergeordneten Verzeichnis oder eine ACL zu verwenden.

Stellen Sie das Verzeichnis setgid mit ein

chmod g+s foo

Legen Sie eine Standard-ACL mit fest

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

Dadurch wird es als Standard-ACL für diesen Pfad festgelegt. Sie müssen das Dateisystem, das diesen Pfad enthält, mit der Option acl mounten!

Jetzt sag mir, warum du denkst, dass du das willst.

wzzrd
quelle
Nun, das Problem ist die Konsistenz. Nichts hindert mich daran, eine Datei oder ein leeres Verzeichnis eines anderen Benutzers in einem Verzeichnis zu löschen, das ich besitze. Wenn es jedoch nicht leer ist, kann ich mein eigenes Verzeichnis nicht löschen.
Alex B
In diesem Fall würde ich eine der von mir bereitgestellten Optionen verwenden. Sie werden gut für Sie arbeiten.
wzzrd
Ich verwende häufig mehrere Konten auf meinem Desktop (eines davon ist das Hauptkonto ohne Rootberechtigung). Ich kann eine solche Situation auch bekommen, wenn ich make installvon root aus anfange, etwas aufzubauen.
Vi.
setgid im übergeordneten Verzeichnis hilft nicht. Nachdem cd ~user && mkdir qqq && touch qqq/qqqich als root fertig bin, kann ich qqq vom Benutzer nicht durch chmod g+s .und loswerden rm -Rf qqq.
Vi.
Mmh. Das ist dann wahrscheinlich eine Umask-Angelegenheit. Wenn Ihr Verzeichnis 775 ist, es setgid ist und Ihre umask 0002 ist, können Dateien für Gruppen geschrieben und daher für Sie entfernt werden. Es funktioniert jedoch nicht mit umask 0022 (was meistens die Standardeinstellung ist). Hätte das sagen sollen. Haben Sie die ACL-Option getestet?
wzzrd