Ich habe einen Ordner mit -wx
Berechtigungen aufgerufen folder1
und einen anderen Ordner darin folder2
mit rwx
Berechtigungen aufgerufen .
Ich habe versucht, folder1
mit diesem Befehl zu löschen :
rm -r folder1
Aber ich habe folgenden Fehler bekommen:
rm: cannot remove 'folder1': Permission denied
Der Grund, warum ich denke, dass ich diesen Fehler habe, ist, dass das rm
Programm zuerst den Inhalt von folder1
(die Namen der darin enthaltenen Dateien und Ordner folder1
) abrufen muss, um diesen Inhalt löschen zu können (weil Sie eine Datei nicht löschen können) oder ordner ohne seinen namen zu kennen denke ich) und dann rm
kann folder1
sich das programm von selbst löschen .
Da das Programm folder1
jedoch nicht über die read
Berechtigung verfügt, rm
kann es seinen Inhalt nicht abrufen und daher seinen Inhalt nicht löschen. Da es seinen Inhalt nicht löschen kann, kann es ihn nicht löschen.
Hab ich recht?
quelle
Antworten:
Ich denke, Ihre Analyse ist richtig: Sie können das Verzeichnis nicht löschen, da es nicht leer ist, und Sie können es nicht leeren, da Sie seinen Inhalt nicht sehen können.
Ich habe es gerade ausprobiert:
Als ich "Sie" schrieb, meinte ich jedes Programm, das Sie ausführen dürfen. Ihr
rm -r
Befehl erkennt zuerst, dassfolder1
es sich um ein Verzeichnis handelt. Daher versucht er, den Inhalt zu ermitteln, um es zu leeren, schlägt jedoch fehl, wenn die Leseberechtigung fehlt. Anschließend wird versucht, es zu löschen, schlägt jedoch fehl, weil es nicht leer ist. Die "Erlaubnis verweigert" ist irreführend; Ich denke, "Verzeichnis nicht leer" (wiermdir
Berichte) wäre angemessener.)quelle
Directory not empty
in diesem Fall nicht gemeldet werden, da es nicht wissen würde, dass es leer ist oder nicht. Wenn Sie versuchen, ein leeres Verzeichnis zu löschen , für das Sie keine Leseberechtigung haben, wird derselbe Fehler weiterhin angezeigt . (Bitte ignorieren Sie auch meinen vorherigen Kommentar, ich hatte meine Denkbeschränkung nicht aufgesetzt).rmdir
melden, dass das Verzeichnis nicht leer ist. Und wenn Sie meinen Test lesen, werden Sie feststellen, dass das Entfernen desfolder1
Verzeichnisses ohne Leseberechtigung akzeptiert wird , sobald ich es geleert habe.Permission denied
wenn ich es versuche,rm -r folder1
wenn es leer ist. Ich bin auf OpenBSD, nicht Linux.-r
verwendet wird, jeder Verzeichniseintrag (mit Ausnahme von.
und..
) entfernt werden sollte, als wäre er ein Dateioperand vonrm -r
. Esrm
sieht so aus, als würde GNU einfach einenrmdir()
Befehl im Verzeichnis ausführen, wenn er nicht lesbar ist, da es keine Möglichkeit gibt, den Inhalt abzurufen.Zum Löschen muss das System in der Lage sein, den Inhalt zu lesen und zu identifizieren, was gelöscht werden muss.
Ich habe versucht zu simulieren, was Sie versuchen:
Wenn wir versuchen, ohne Leserechte zu löschen, schlägt dies fehl:
In einer Strace für die beiden Versuche besteht der Unterschied darin, dass der Verzeichnisinhalt nicht gelesen werden kann (getdents):
Mit Leserechten:
Selbst wenn Sie ein Verzeichnis besitzen und dieses über das ausführbare Bit verfügt, benötigen Sie Leseberechtigungen, damit Sie dessen Inhalt sehen und den Ordner löschen können. Es ist jedoch nicht dasselbe für eine Datei.
quelle
Nun, ich habe nicht genug Reputation, um die Antwort von ttaran7 zu kommentieren, also sieht es so aus, als müsste es eine Antwort sein. Meine Gegenstimme ist auch nicht öffentlich sichtbar, weil ich ein schlechtes Ansehen habe. Ich habe für diese Antwort gestimmt, weil sie tatsächlich eine Systemaufruf-Ablaufverfolgung enthält, und nicht nur Spekulation.
Um die Frage des OP zu beantworten: Ja, Ihre Argumentation war richtig: Sie werden blockiert, wenn Sie das Verzeichnis nicht lesen können
Ich habe eine ähnliche Ablaufverfolgung durchgeführt wie sie (ttaran7), weil ich die gleiche Überlegung vermutete: Der
rm
Aufruf würde fehlschlagen, wenn das Verzeichnis nicht gelesen würde, und das wäre das Ende, keine Chance, sich über das leere Verzeichnis zu beschweren. Bei einem zweiten Blick auf den Trace, den ich erstellt habe, ist mir aufgefallen, dass ein Systemaufruf ausgeführt wurde, um zu versuchen, die Verknüpfung des angegebenen Dateinamens trotzdem aufzuheben:Schauen Sie sich die 4. Zeile an:
unlinkat
... was fehlschlägt, weil das Verzeichnis NICHT leer ist. Nun, das ist, was ich als unerwartetes Verhalten betrachten würde, die Tatsache, dass es versucht, das Verzeichnis überhaupt zu löschen, obwohl es keine Leseberechtigungen hat.quelle