Warum kann rm schreibgeschützte Dateien entfernen?

91

444Wie rmkann ich eine Datei entfernen, wenn ich sie erst erstelle und dann ihre Berechtigungen auf (schreibgeschützt) ändere ?

Wenn ich das mache:

echo test > test.txt
chmod 444 test.txt
rm test.txt

... rmwerden gefragt, ob ich die schreibgeschützte Datei entfernen möchte test.txt. Ich hätte damit gerechnet, dass rmsich eine solche Datei nicht entfernen lässt und dass ich erst eine machen müsste chmod +w test.txt. Wenn ich rm -f test.txtdann rmdie Datei entfernen , ohne auch nur zu fragen, auch wenn es nur gelesen wird .

Kann das jemand klären? Ich verwende Ubuntu 12.04 / bash.

Magnus
quelle
Erläuterung: Ich führe diese Befehle als normaler Benutzer und nicht als Root aus.
Magnus

Antworten:

104

Alles, was rmbenötigt wird, ist eine Schreib- und Ausführungsberechtigung für das übergeordnete Verzeichnis. Die Berechtigungen der Datei selbst sind irrelevant.

Hier ist eine Referenz, die das Berechtigungsmodell klarer erklärt, als ich es jemals könnte:

Jeder Versuch, auf die Daten einer Datei zuzugreifen, erfordert eine Leseberechtigung. Jeder Versuch, die Daten einer Datei zu ändern, erfordert eine Schreibberechtigung. Jeder Versuch, eine Datei (ein Programm oder ein Skript) auszuführen, erfordert eine Ausführungsberechtigung ...

Da Verzeichnisse nicht wie normale Dateien verwendet werden, funktionieren die Berechtigungen geringfügig (aber nur geringfügig) anders. Der Versuch, die Dateien in einem Verzeichnis aufzulisten, erfordert eine Leseberechtigung für das Verzeichnis, jedoch nicht für die darin enthaltenen Dateien. Für den Versuch, eine Datei zu einem Verzeichnis hinzuzufügen, eine Datei aus einem Verzeichnis zu löschen oder eine Datei umzubenennen, ist eine Schreibberechtigung für das Verzeichnis erforderlich, jedoch (möglicherweise überraschenderweise) nicht für die darin enthaltenen Dateien. Die Ausführungsberechtigung gilt nicht für Verzeichnisse (ein Verzeichnis kann nicht auch ein Programm sein). Dieses Berechtigungsbit wird jedoch für Verzeichnisse für andere Zwecke wiederverwendet.

Für ein Verzeichnis ist eine Ausführungsberechtigung erforderlich, um darin eine CD erstellen zu können (d. H., Um ein Verzeichnis zu Ihrem aktuellen Arbeitsverzeichnis zu machen).

Execute ist für ein Verzeichnis erforderlich, um auf die "Inode" -Informationen der darin enthaltenen Dateien zuzugreifen. Sie benötigen dies, um ein Verzeichnis zu durchsuchen und die Inodes der darin enthaltenen Dateien zu lesen. Aus diesem Grund wird die Ausführungsberechtigung für ein Verzeichnis häufig als Suchberechtigung bezeichnet.

ire_and_curses
quelle
2
Wenn ich also ein Verzeichnis erstellen wollte, in dem einige Dateien nicht gelöscht / geändert werden konnten, ohne vorher chmod auszuführen, andere aber frei beschreibbar waren, wäre das unmöglich? Ich müsste das Verzeichnis 555 chmod, was bedeuten würde, dass keine Dateien im Verzeichnis erstellt oder geändert werden könnten.
Magnus
3
@Magnus - Natürlich hindert nichts Sie daran, ein beschreibbares untergeordnetes Verzeichnis im schreibgeschützten Verzeichnis zu erstellen und Ihre beschreibbaren Dateien darin zu speichern. Das untergeordnete Verzeichnis selbst kann nicht gelöscht werden, der Inhalt jedoch.
ire_and_curses
7
Können Sie ein Verzeichnis nicht klebrig machen, +tdamit Benutzer keine Dateien in diesem Verzeichnis mehr ändern oder entfernen können, deren Eigentümer sie nicht sind, selbst wenn sie Schreibzugriff auf das Verzeichnis haben?
Shadur
3
@Magnus Wenn Sie über Root-Zugriff (einschließlich sudo) verfügen, können Sie chattrDateien das unveränderliche Flag hinzufügen. Wenn nicht, dann ist ire_and_curses ganz richtig.
James O'Gorman
6
Die Verwendung von rm -f funktioniert nur, solange ich nüchtern bin. Außerdem habe ich keine Ahnung, was die verzögerten Bash-Skripte, die ich schreibe, möglicherweise tun oder nicht tun
Magnus
53

Okay, laut Ihrem Kommentar zu ire_and_curses möchten Sie einige Dateien wirklich unveränderlich machen. Sie können das mit dem chattrBefehl tun . Zum Beispiel:

z.B

$ cd /tmp
$ touch immutable-file
$ sudo chattr +i immutable-file

$ rm -f immutable-file
rm: remove write-protected regular empty file `immutable-file'? y
rm: cannot remove `immutable-file': Operation not permitted

$ mv immutable-file someothername
mv: cannot move `immutable-file' to `someothername': Operation not permitted

$ echo foo > immutable-file 
-bash: immutable-file: Permission denied

Sie können mit einer unveränderlichen Datei nichts anfangen - Sie können sie nicht löschen, bearbeiten, überschreiben, umbenennen, chmod oder chownen oder irgendetwas anderes. Das einzige, was Sie damit machen können, ist es zu lesen (wenn Unix-Berechtigungen dies erlauben) und (als root) chattr -i, um das unveränderliche Bit zu entfernen.

Nicht alle Dateisysteme unterstützen alle Attribute. AFAIK, unveränderlich wird von allen gängigen Linux-Dateisystemen unterstützt (einschließlich ext2 / 3/4 und xfs. Zfsonlinux unterstützt derzeit überhaupt keine Attribute)

cas
quelle
3
es ist gelegentlich nützlich. Übrigens kann nicht einmal root eine unveränderliche Datei ändern oder löschen (nicht ohne vorher das unveränderliche Attribut zu entfernen). Verwenden Sie diese Option auch, um lsattrAttribute aufzulisten .
cas
2
+1 - Ich hatte Attribute vergessen und war so damit beschäftigt, die wörtliche Frage zu beantworten, rmdass mir das noch nie in den
Sinn
2
Dies ist dateisystemspezifisch und kann zu weiteren Problemen führen, die dadurch behoben werden.
Stéphane Gimenez
4
@Magnus: Zu den möglichen Problemen gehören die Sicherung (nicht alle Sicherungsdienstprogramme sichern Attribute, die meisten jedoch nicht) und die Wiederherstellung (wenn Sie in einem Verzeichnis wiederherstellen, das bereits eine unveränderliche Datei enthält, können einige Programme diese Datei nicht überschreiben als schwerwiegender Fehler und Abbruch). Sie können sich auch verwirren, wenn Sie vergessen, dass Sie eine Datei unveränderlich gemacht haben, und nicht herausfinden können, warum Sie sie nicht löschen können. Die Fehlermeldung "Vorgang nicht zulässig" ist dieselbe Fehlermeldung, die bei einigen Arten von Dateisystemen angezeigt wird Korruption, die zu potenziell gefährlichen Überreaktionen führen kann.
cas
1
Sie können eine unveränderliche Datei kopieren (cp).
Octopus
0

Eine Antwort auf diese Frage besagt, dass Sie eine Datei nur dann aus dem Verzeichnis löschen können, wenn sie nur über die writeBerechtigung verfügt. Das ist völlig falsch! Probier es einfach! Gib einem Verzeichnis nur die writeErlaubnis und versuche zu löschen, das kannst du nicht!
Um eine Datei in einem Verzeichnis zu löschen, benötigen Sie beide writeund die executeBerechtigung für das Verzeichnis

Zurück zur Frage: Um eine Datei mit zu löschen, rmentfernen Sie einfach die Inode-Informationen aus dem Verzeichnis, dh Sie sind nicht shreddingauf der Festplatte. Wenn sich die Inode-Informationen der Datei nicht im Verzeichnis befinden, können Sie nicht darauf zugreifen (auch weil Sie sie nicht sehen können, da sie nicht im übergeordneten Verzeichnis aufgeführt sind), dh, sie werden für Sie gelöscht .
Um eine Datei aus einem Verzeichnis zu löschen, benötigen Sie lediglich die Berechtigung für das Verzeichnis. Berechtigungen für diese Datei sind irrelevant

Edward Torvalds
quelle