Wie kann verhindert werden, dass rm -rf mit bestimmten Ordnern verwechselt wird?

8

Ich denke, so ziemlich die Leute hier haben fälschlicherweise rm -rfdas falsche Verzeichnis erstellt, und hoffentlich hat es keinen großen Schaden angerichtet. Gibt es eine Möglichkeit, Benutzer daran zu hindern, eine ähnliche Unix-Horrorgeschichte zu schreiben ? Jemand erwähnte dies (im Kommentarbereich des vorherigen Links )

... Ich bin mir ziemlich sicher, dass jetzt jeder Unix-Kurs oder jede Unix-Firma, die Unix verwendet, rm -fr setzt, um Konten von Personen zu deaktivieren, die versuchen, es auszuführen, oder sie daran zu hindern, es auszuführen ...

Gibt es eine Implementierung davon in einer aktuellen Unix- oder Linux-Distribution? Und wie wird dieser Fehler häufig auch von einem Systemadministrator (mit Root-Zugriff) verhindert?

Es scheint, dass das Stammverzeichnis ( /) in Solaris (seit 2005) und GNU (seit 2006) geschützt war . Gibt es sowieso die Möglichkeit, den gleichen Schutz auch für einige andere Ordner zu implementieren?

Um mehr Klarheit zu schaffen, habe ich nicht nach allgemeinen Hinweisen zur rmVerwendung gefragt (und ich habe den Titel aktualisiert, um darauf hinzuweisen). Ich möchte etwas mehr wie den Schutz des Stammordners: Damit rm -rf /Sie einen bestimmten Parameter übergeben müssen: rm -rf --no-preserve-root /.. Gibt es ähnliche Implementierungen für benutzerdefinierte Verzeichnisse? Oder kann ich Dateien angeben, die zusätzlich /durch die Optionerve-root geschützt werden sollen ?

Amyassin
quelle
11
1) Änderungsmanagement 2) Backups.
Mattdm
6
Wahrscheinlich wäre der einzige Weg, den rmBefehl durch einen zu ersetzen, der diese Funktion nicht hat.
Keith
2
safe-rm vielleicht
sr_
2
Die meisten Distributionen verwenden "alias rm =" rm -i ", wodurch rm Sie fragt, ob Sie sicher sind. außerdem: wissen, was Sie tun. Werden Sie nur bei Bedarf root. Für jeden Benutzer mit Root-Rechten muss Sicherheit jeglicher Art in und durch den Benutzer implementiert werden. Stellen Sie jemanden ein, wenn Sie es nicht selbst tun können. Im Laufe der Zeit entspricht jede Gegenmaßnahme der obigen Alias-Zeile, wenn Sie sich nicht selbst um das Problem kümmern können.
Bananguin
1
@amyassin using rm -rfkann ein Ereignis sein, das einen Lebenslauf generiert. Überprüfen Sie und überprüfen Sie dreifach, bevor Sie es ausführen
Mitternachtsstahl

Antworten:

15

Geben Sie nicht ein rm -rf, um Fehler zu vermeiden .rm -rf

Wenn Sie einen Verzeichnisbaum löschen müssen, empfehle ich den folgenden Workflow:

  • Wechseln Sie bei Bedarf in das übergeordnete Verzeichnis des Verzeichnisses, das Sie löschen möchten.
  • mv directory-to-delete DELETE
  • Untersuchen DELETEund überprüfen Sie, ob es tatsächlich das ist, was Sie löschen wollten
  • rm -rf DELETE

Rufen Sie niemals rm -rfmit einem anderen Argument als an DELETE. Wenn Sie das Löschen in mehreren Schritten durchführen, können Sie überprüfen, ob Sie nicht das Falsche löschen, entweder aufgrund eines Tippfehlers (wie in rm -rf /foo /baranstelle von rm -rf /foo/bar) oder aufgrund eines Braino (oops, nein, ich wollte löschen foo.oldund behalten foo.new). .

Wenn Ihr Problem darin besteht, dass Sie anderen nicht vertrauen können, dass sie nicht tippen rm -rf, sollten Sie ihre Administratorrechte entfernen. Es kann noch viel mehr schief gehen als rm.


Machen Sie immer Backups .

Überprüfen Sie regelmäßig, ob Ihre Backups funktionieren und auf dem neuesten Stand sind.

Behalten Sie alles, was nicht einfach heruntergeladen werden kann, unter Versionskontrolle.


Wenn Sie mit einem einfachen Unix-System einige Verzeichnisse wirklich durch löschen möchten rm, ersetzen Sie (oder besser Schatten) rmdurch ein benutzerdefiniertes Skript, das bestimmte Argumente zurückweist. Oder von hg rm.

Einige Unix-Varianten bieten mehr Möglichkeiten.

  • Unter OSX können Sie eine Zugriffssteuerungsliste für ein Verzeichnis festlegen , die das Löschen der darin enthaltenen Dateien und Unterverzeichnisse verhindert, ohne das Erstellen neuer Einträge oder das Ändern vorhandener Einträge zu verhindern: chmod +a 'group:everyone deny delete_child' somedir(Dies verhindert nicht das Löschen von Dateien in Unterverzeichnissen: if Wenn Sie dies möchten, legen Sie die ACL auch im Unterverzeichnis fest.
  • Unter Linux können Sie Regeln in SELinux, AppArmor oder anderen Sicherheitsframeworks festlegen, die rmdas Ändern bestimmter Verzeichnisse verbieten .
Gilles 'SO - hör auf böse zu sein'
quelle
Ja, das Sichern ist die erstaunlichste Lösung, aber ich habe mir so etwas wie die --no-preserve-rootOption für einen anderen wichtigen Ordner überlegt . Und das gibt es anscheinend nicht einmal als Übung ...
Amyassin
Ich habe die Frage bearbeitet, um anzuzeigen, was ich mehr will ...
Amyassin
1
@amyassin Ich fürchte, es gibt nichts mehr (zumindest nicht unter Linux). rm -rfbedeutet schon "lösche das, ja ich bin sicher ich weiß was ich tue". Wenn Sie mehr möchten, ersetzen Sie es rmdurch ein Skript, das sich weigert, bestimmte Verzeichnisse zu löschen.
Gilles 'SO - hör auf böse zu sein'
Bitte bearbeiten Sie den letzten Kommentar zu der Frage, da ich denke, dass sie die Frage gut beantwortet ...
Amyassin
2
@amyassin Eigentlich nehme ich das zurück. Unter herkömmlichem Linux gibt es nichts mehr, aber Sie können Apparmor / SELinux /… -Regeln festlegen, die den rmZugriff auf bestimmte Verzeichnisse verhindern. Da Ihre Frage nicht nur Linux betrifft, hätte ich auch OSX erwähnen sollen, das etwas mit dem zu tun hat, was Sie wollen.
Gilles 'SO - hör auf böse zu sein'
4

Wenn Sie rm *und das zsh verwenden, können Sie die Option einstellen rmstarwait:

setopt rmstarwait

Jetzt warnt die Shell, wenn Sie Folgendes verwenden *:

> zsh -f
> setopt rmstarwait
> touch a b c
> rm *
zsh: sure you want to delete all the files in /home/unixuser [yn]? _

Wenn Sie es ablehnen ( n), passiert nichts. Andernfalls werden alle Dateien gelöscht.

qbi
quelle
Wofür wird das zsh -fverwendet?
James
3

rm -rf *Erstellen Sie zum Schutz vor einem Unfall in einem Verzeichnis eine Datei mit dem Namen "-i" (dies können Sie mit Emacs oder einem anderen Programm tun) in diesem Verzeichnis. Die Shell versucht, -i zu interpretieren und veranlasst sie, in den interaktiven Modus zu wechseln.

Beispiel: Sie haben ein Verzeichnis rmtestmit der darin genannten Datei aufgerufen -i. Wenn Sie versuchen, rmalles im Verzeichnis zu finden, rmwird es zuerst -ian das Verzeichnis übergeben und wechselt in den interaktiven Modus. Wenn Sie eine solche Datei in die Verzeichnisse einfügen, für die Sie einen gewissen Schutz wünschen, kann dies hilfreich sein.

Beachten Sie, dass dies gegen unwirksam ist rm -rf rmtest.

Silverrocker
quelle
Ich habe die Frage bearbeitet, um anzuzeigen, was ich mehr will ...
Amyassin
Super Trick! Die Datei ist einfach zu erstellen mit> -i
capitano666
2

BEARBEITEN wie durch Kommentar vorgeschlagen:

Sie können das Attribut von ändern, um die Datei oder das Verzeichnis unveränderlich zu machen, und es kann dann nicht einmal von root gelöscht werden, bis das Attribut entfernt wird.

chattr +i /some/important/file

Dies bedeutet auch, dass die Datei auch von root ohnehin nicht beschrieben oder geändert werden kann . Ein weiteres anscheinend verfügbares Attribut, das ich selbst nicht verwendet habe, ist das Append-Attribut ( chattr +a /some/important/file. Dann kann die Datei nur im Append-Modus geöffnet werden, was bedeutet, dass auch keine Löschung erfolgt. Sie können sie jedoch hinzufügen (z. B. eine Protokolldatei). Dies bedeutet, dass Sie vimSie können es beispielsweise nicht bearbeiten , aber Sie können es tun echo 'this adds a line' >> /some/important/file. Die Verwendung von >anstelle von >>wird fehlschlagen.

Diese Attribute können mit einem Minuszeichen deaktiviert werden, d. H. chattr -i file

Andernfalls, wenn dies nicht geeignet ist, übe ich immer ls /some/dirzuerst, und anstatt den Befehl erneut einzugeben, drücke den Pfeil CTL-A nach oben, lösche dann den lsund tippe meinen ein, rm -rfwenn ich ihn brauche. Nicht perfekt, aber wenn Sie sich die Ergebnisse von ls ansehen, wissen Sie vorher, ob es das ist, was Sie wollten.

Drake Clarris
quelle
Ich habe die Frage bearbeitet, um anzugeben, was ich mehr will ...
Amyassin
2

Wenn Sie die Programmiersprache C verstehen, ist es meiner Meinung nach möglich, den rm-Quellcode neu zu schreiben und einen kleinen Patch für den Kernel zu erstellen. Ich habe dies auf einem Server gesehen und es war unmöglich, einige wichtige Verzeichnisse zu löschen. Wenn Sie 'rm -rf / direcotyr' eingeben, wird eine E-Mail an sysadmin gesendet.

ValeriRangelov
quelle
1

Eine mögliche Wahl besteht darin, die Verwendung zu beenden rm -rfund die Verwendung zu starten rm -ri. Der zusätzliche iParameter besteht darin, sicherzustellen, dass Sie gefragt werden, ob Sie die Datei wirklich löschen möchten.

Wahrscheinlich ist es am besten, wenn Sie einen Alias rm -rifür etwas Denkwürdiges verwenden kill_it_with_fire. Wenn Sie Lust haben, etwas zu entfernen, töten Sie es auf diese Weise mit Feuer.

NlightNFotis
quelle
1
Ich mag den Namen, aber ist das nicht fdas genaue Gegenteil von iOption? Ich habe es versucht und trotzdem gearbeitet ...
Amyassin
@amyassin Ja, das ist es. Für eine seltsame Art von Mode dachte ich, ich hätte nur da rdrin. Habe es einfach behoben.
NlightNFotis
Ich habe die Frage bearbeitet, um anzugeben, was ich mehr will ...
Amyassin
-1

Ich möchte den Verzeichnisnamen wie folgt an die erste Stelle setzen:

$ rm /directoryname -rf
kieranwild
quelle
5
Dies verstößt gegen die POSIX-Richtlinien.
Gelraen
Ich habe die Frage bearbeitet, um anzugeben, was ich mehr will ...
Amyassin