Wie vermeide ich versehentliche rm -rf / *?

164

Ich bin nur aus rm -rf /*Versehen gerannt, aber ich meinte rm -rf ./*(beachte den Stern nach dem Schrägstrich).

alias rm='rm -i'und --preserve-rootstandardmäßig hat mich nicht gerettet, gibt es also automatische Sicherheitsvorkehrungen dafür?


Ich war nicht root und habe den Befehl sofort abgebrochen, aber irgendwo gab es einige entspannte Berechtigungen, weil ich bemerkte, dass meine Bash-Eingabeaufforderung bereits kaputt war. Ich möchte nicht auf Berechtigungen verlassen und nicht root sein (ich konnte den gleichen Fehler mit machen sudo), und ich möchte nicht , wegen eines für mysteriös Bugs jagen Datei irgendwo im System fehlt, so, Backups und sudosind gut , aber ich hätte gerne etwas Besseres für diesen speziellen Fall.


Überlegen Sie zweimal und nutzen Sie das Gehirn. Ich benutze es tatsächlich! Aber ich benutze es, um eine komplexe Programmieraufgabe mit 10 verschiedenen Dingen zu lösen. Ich bin tief genug in diese Aufgabe vertieft, es ist keine Gehirnleistung mehr vorhanden, um Flags und Pfade zu überprüfen, ich denke nicht einmal in Befehlen und Argumenten, ich denke in Aktionen wie 'Empty Current Dir'. Ein anderer Teil meines Gehirns übersetzt sie in Befehle und manchmal macht es Fehler. Ich möchte, dass der Computer sie korrigiert, zumindest die gefährlichen.

Valentin Nemcev
quelle
13
Zu Ihrer Information können Sie auch tun , rm -rf . /mydirstatt rm -rf ./mydirund zu töten , was Verzeichnis , das Sie in waren. Das finde ich öfter passiert.
user606723
27
Um eine Waffenanalogie zu verwenden, lautet diese Frage wie folgt: Bitte lassen Sie die Waffe erkennen, dass ich auf meinen Fuß ziele und nicht feuere, aber ich möchte keine Verantwortung dafür übernehmen, dass die Waffe überhaupt nicht auf meinen Fuß gerichtet ist. Waffen und Computer sind dumm, und wenn Sie etwas Dummes tun, erhalten Sie diese Ergebnisse. Wenn Sie der Waffenanalogie folgen, können Sie sich nur durch Wachsamkeit und Übung selbst verletzen.
Slillibri
73
@slillibri Abgesehen davon, dass rmes sich nicht um eine Waffe, sondern um ein Computerprogramm handelt, könnte es klug genug sein, um festzustellen, dass der Benutzer einige wichtige Dateien löschen und eine Warnung ausgeben wird (wie dies tatsächlich der Fall ist, wenn Sie versuchen, rm -rf /ohne Stern auszukommen).
Valentin Nemcev
80
@ slillibri Waffen haben Sicherheiten. Die Frage, wie der rmBefehl besser abgesichert werden kann, ist eine absolut legitime Frage des Systemadministrators.
Gilles
21
sudo rm / bin / rm nicht empfohlen, aber verhindert die meisten rm's :-)
Paul

Antworten:

220

Einer der Tricks, denen ich folge, besteht darin, #den Anfang zu setzen, während ich den rmBefehl verwende.

root@localhost:~# #rm -rf /

Dies verhindert die versehentliche Ausführung von rmin der falschen Datei / im falschen Verzeichnis. Nach der Überprüfung #vom Anfang entfernen . Dieser Trick funktioniert, da in Bash ein Wort, das mit beginnt, #bewirkt, dass dieses Wort und alle verbleibenden Zeichen in dieser Zeile ignoriert werden. Der Befehl wird also einfach ignoriert.

ODER

Wenn Sie ein wichtiges Verzeichnis verhindern möchten, gibt es noch einen Trick.

Erstellen Sie eine Datei mit dem Namen -iin diesem Verzeichnis. Wie kann so eine seltsame Datei erstellt werden? Mit touch -- -iodertouch ./-i

Versuchen Sie jetzt rm -rf *:

sachin@sachin-ThinkPad-T420:~$ touch {1..4}
sachin@sachin-ThinkPad-T420:~$ touch -- -i
sachin@sachin-ThinkPad-T420:~$ ls
1  2  3  4  -i
sachin@sachin-ThinkPad-T420:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'? 

Hier *wird -idie Befehlszeile erweitert, so dass Ihr Befehl letztendlich wird rm -rf -i. Daher wird der Befehl vor dem Entfernen abgefragt. Sie können diese Datei setzen in Ihrem /, /home/, /etc/etc.

ODER

Verwenden Sie --preserve-rootals Option zu rm. In den rmneueren coreutilsPaketen ist diese Option die Standardeinstellung.

--preserve-root
              do not remove `/' (default)

ODER

Verwenden Sie safe-rm

Auszug aus der Website:

Safe-rm ist ein Sicherheitstool, das das versehentliche Löschen wichtiger Dateien verhindern soll, indem / bin / rm durch einen Wrapper ersetzt wird, der die angegebenen Argumente mit einer konfigurierbaren schwarzen Liste von Dateien und Verzeichnissen vergleicht, die niemals entfernt werden sollten.

Benutzer, die versuchen, eine dieser geschützten Dateien oder Verzeichnisse zu löschen, können dies nicht und erhalten stattdessen eine Warnmeldung:

$ rm -rf /usr
Skipping /usr
Sachin Divekar
quelle
10
safe-rm sieht sehr gut aus und untersucht es jetzt ...
Valentin Nemcev
45
safe-rm ist ordentlich. Auch das ist ein guter Trick mit der -iDatei. Hah Dumme Prügelei.
EricR
5
Erstaunlich, was für ein Trick in Unix gemacht wird.
WernerCD
4
Die Erstellungsdatei mit dem Namen -i ist absolut genial. Ich hätte das vor ungefähr einem Jahr verwenden können, als ich versehentlich eine rm -rf / etc / * auf VPS ausgeführt habe ... (zum Glück mache ich nächtliche Schnappschüsse und konnte sie in weniger als 45 Minuten wiederherstellen).
David W
9
Es ist ein Genie. Hexerei wäretouch -- -rf
Mircea Vutcovici
46

Ihr Problem:

Ich habe nur aus Versehen rm -rf / * ausgeführt, aber ich meinte rm -rf ./* (beachte den Stern nach dem Schrägstrich).

Die Lösung: Tu das nicht! Aus praktischen Gründen nicht ./am Anfang eines Pfades verwenden. Die Schrägstriche geben dem Befehl keinen Wert und sorgen nur für Verwirrung.

./*bedeutet dasselbe wie *, daher ist der obige Befehl besser geschrieben als:

rm -rf *

Ist hier ein in Verbindung stehendes Problem. Ich sehe oft den folgenden Ausdruck, bei dem jemand davon ausgegangen FOOist, dass er auf so etwas eingestellt ist /home/puppies. Ich habe das erst heute in der Dokumentation eines großen Softwareherstellers gesehen.

rm -rf $FOO/

Wenn dies FOOjedoch nicht festgelegt ist, wird dies zu ausgewertet rm -rf /, wodurch versucht wird, alle Dateien auf Ihrem System zu entfernen. Der abschließende Schrägstrich ist nicht erforderlich, daher sollten Sie ihn aus praktischen Gründen nicht verwenden.

Das Folgende wird dasselbe tun und es ist weniger wahrscheinlich, dass Ihr System beschädigt wird:

rm -rf $FOO

Ich habe diese Tipps auf die harte Tour gelernt. Als ich vor 14 Jahren meinen ersten Superuser-Account hatte, lief ich versehentlich rm -rf $FOO/aus einem Shell-Skript und zerstörte ein System. Die 4 anderen Sysadmins sahen sich das an und sagten: 'Yup. Das macht jeder einmal. Hier ist Ihr Installationsmedium (36 Disketten). Geh und repariere es. '

Andere Leute empfehlen hier Lösungen wie --preserve-rootund safe-rm. Diese Lösungen sind jedoch nicht für alle Un * xe-Varianten verfügbar und funktionieren möglicherweise nicht unter Solaris, FreeBSD und MacOSX. safe-rmErfordert außerdem, dass Sie auf jedem verwendeten Linux-System zusätzliche Pakete installieren. Wenn Sie sich verlassen safe-rm, was passiert , wenn Sie einen neuen Job beginnen und sie nicht haben safe-rminstalliert? Diese Werkzeuge sind eine Krücke, und es ist viel besser, sich auf bekannte Standardeinstellungen zu verlassen und Ihre Arbeitsgewohnheiten zu verbessern.

Stefan Lasiewski
quelle
19
Mein Freund sagte mir, dass er nie benutzt rm -rf *. Er wechselt immer zuerst das Verzeichnis und verwendet ein bestimmtes Ziel. Der Grund dafür ist, dass er die Geschichte der Shell häufig nutzt und befürchtet, dass ein derartiger Befehl in seiner Geschichte zur falschen Zeit auftauchen könnte.
Haggai_e
@haggai_e: Guter Tipp. Als ich neu bei Unix war, bin ich einmal auf einen Fehler gestoßen, bei dem rm -rf *auch .und entfernt wurden ... Ich war root, und das überquerte die in niedrigere Verzeichnisse wie ../../.., und war ziemlich destruktiv. Ich versuche rm -rf *seitdem sehr vorsichtig zu sein.
Stefan Lasiewski
2
rm -rf $FOOwird nicht helfen, wenn Sie müssen rm -rf $FOO/$BAR. cd $FOO && rm -rf $BARwird helfen, obwohl es viel länger ist.
Victor Sergienko
5
@ VictorSergienko, mit bash, wie wäre es angeben, ${FOO:?}wie in rm -rf ${FOO:?}/und rm -rf ${FOO:?}/${BAR:?}. Es wird verhindern, dass es jemals übersetzt wird rm -rf /. Ich habe einige weitere Informationen dazu in meiner Antwort hier .
Acumenus
@haggai_e: Ich finde dies einer der besten Ratschläge zu diesem Thema. Ich habe mir den Finger verbrannt, indem ich rm -rf *in einer for-Schleife versehentlich in das falsche Verzeichnis gewechselt bin und etwas anderes gelöscht habe. Wenn ich ein bestimmtes Ziel verwendet hätte, hätte es eine viel geringere Chance gehabt, das Falsche zu löschen.
richk
30

Da es sich um "Serverfault" handelt, möchte ich Folgendes sagen:

Wenn Sie Dutzende oder mehr Server, mit einem ziemlich großen Team von Administratoren / Benutzer, jemand wird sich rm -rfoder chowndas falsche Verzeichnis.

Sie sollten einen Plan haben, um den betroffenen Dienst mit der geringstmöglichen MTTR wiederherzustellen.

Nicht jetzt
quelle
4
Und Sie sollten eine VM oder eine Ersatzbox verwenden, um die Wiederherstellung zu üben - finden Sie heraus, was nicht funktioniert hat, und verfeinern Sie den Plan. Wir werden alle zwei Wochen einen Neustart durchführen - weil es in unserem Gebäude zu Stromausfällen gekommen ist und jedes Mal, wenn es schmerzhaft war. Indem wir ein paar geplante Abschaltungen aller Racks vorgenommen haben, haben wir es von ein paar Tagen auf ungefähr 3 Stunden verkürzt - jedes Mal, wenn wir lernen, welche Bits zum Automatisieren / Korrigieren von init.d-Skripten usw. erforderlich sind
Danny Staple
Versuchen Sie diesen Befehl auf einer VM. Es ist interessant! Aber machen Sie zuerst einen Schnappschuss.
Stefan Lasiewski
23

Die besten Lösungen bestehen darin, Ihre Gewohnheiten dahingehend zu ändern, dass Sie sie nicht rmdirekt verwenden.

Ein Ansatz ist, echo rm -rf /stuff/with/wildcards*zuerst zu laufen . Vergewissern Sie sich, dass die Ausgabe der Platzhalterzeichen in Ordnung ist, und verwenden Sie dann den Verlauf der Shell, um den vorherigen Befehl ohne den Befehl auszuführen echo.

Ein anderer Ansatz besteht darin, den echoBefehl auf Fälle zu beschränken, in denen es offensichtlich ist, was Sie löschen. Entfernen Sie das Verzeichnis, und erstellen Sie ein neues, anstatt alle Dateien in einem Verzeichnis zu entfernen. Eine gute Methode besteht darin, das vorhandene Verzeichnis in umzubenennen DELETE-foo, dann ein neues Verzeichnis foomit den entsprechenden Berechtigungen zu erstellen und schließlich zu entfernen DELETE-foo. Ein Nebeneffekt dieser Methode ist, dass der in Ihrem Verlauf eingegebene Befehl lautet rm -rf DELETE-foo.

cd ..
mv somedir DELETE-somedir
mkdir somedir                 # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir             # just to make sure we're deleting the right thing
rm -rf DELETE-somedir

Wenn Sie wirklich darauf bestehen, eine Reihe von Dateien zu löschen, weil das Verzeichnis erhalten bleiben muss (weil es immer vorhanden sein muss oder weil Sie nicht die Berechtigung haben, es neu zu erstellen), verschieben Sie die Dateien in ein anderes Verzeichnis und löschen Sie dieses Verzeichnis .

mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME

(Drücken Sie diese Alt+ .Taste.)

Das Löschen eines Verzeichnisses von innen wäre attraktiv, da rm -rf .es kurz ist und daher nur ein geringes Risiko für Tippfehler besteht. Typische Systeme lassen das leider nicht zu. Sie können rm -rf -- "$PWD"stattdessen mit einem höheren Risiko von Tippfehlern umgehen, aber die meisten von ihnen führen dazu, dass nichts entfernt wird. Beachten Sie, dass dies einen gefährlichen Befehl in Ihrem Shell-Verlauf hinterlässt.

Wann immer Sie können, verwenden Sie die Versionskontrolle. Sie nicht rm, Sie cvs rmoder was auch immer, und das ist unlösbar.

Zsh bietet Optionen, die Sie vor der Ausführung rmmit einem Argument rm_star_silentauffordern , das alle Dateien in einem Verzeichnis auflistet: (standardmäßig aktiviert) fordert Sie vor der Ausführung auf rm whatever/*, und rm_star_wait(standardmäßig deaktiviert) fügt eine Verzögerung von 10 Sekunden hinzu, während der Sie nicht bestätigen können. Dies ist von begrenztem Nutzen, wenn Sie beabsichtigen, alle Dateien in einem Verzeichnis zu entfernen, da Sie die Eingabeaufforderung bereits erwarten. Es kann helfen, Tippfehler wie rm foo *bei zu vermeiden rm foo*.

Es gibt viel mehr Lösungen, bei denen der rmBefehl geändert wird. Eine Einschränkung dieses Ansatzes ist, dass Sie sich eines Tages auf einem Computer mit dem echten befinden rmund automatisch anrufen rm, in der Erwartung einer Bestätigung… und als Nächstes Backups wiederherstellen.

Gilles
quelle
mv -t DELETE_ME -- *ist ein bisschen narrensicherer.
Tobu
@ Giles Nicht rmdirekt verwenden ist ein guter Rat! Eine noch bessere Alternative ist die Verwendung des findBefehls .
ACULICH
Und wenn Sie das Verzeichnis beibehalten möchten, können Sie dies ganz einfach tun, indem Sie find somedir -type f -deletedie Option verwenden, die alle Dateien in somedirdem Verzeichnis löscht, jedoch das Verzeichnis und alle Unterverzeichnisse verlässt.
ACULICH
19

Sie können jederzeit einen Alias ​​erstellen, wie Sie bereits erwähnt haben:

what_the_hell_am_i_thinking() {
   echo "Stop." >&2
   echo "Seriously." >&2
   echo "You almost blew up your computer." >&2
   echo 'WHAT WERE YOU THINKING!?!?!' >&2
   echo "Please provide an excuse for yourself below: " 
   read 
   echo "I'm sorry, that's a pathetic excuse. You're fired."
   sleep 2
   telnet nyancat.dakko.us
}

alias rm -fr /*="what_the_hell_am_i_thinking"

Sie können es auch in einen Befehlszeilen-Twitter-Client integrieren, um Ihre Freunde darauf aufmerksam zu machen, dass Sie sich selbst fast erniedrigt haben, indem Sie Ihre Festplatte mit rm -fr /*root gelöscht haben.

Naftuli Kay
quelle
3
+1 für Telnet miku.acm.uiuc.edu
Ali
1
alias echo = "telnet miku.acm.uiuc.edu"
kubanczyk
Ich darf nicht alt genug sein ... was bedeutet das telnet miku.acm.uiuc.edu?
Kyle Strand
Probieren Sie es aus und finden Sie es heraus. Es ist zerstörungsfrei. Wenn Sie so paranoid sind, wie Sie sein sollten, führen Sie eine VM aus.
Naftuli Kay
3
-1 Sie können keine Befehle mit Leerzeichen
aliasen,
15

Ja: Arbeiten Sie nicht als Root und überlegen Sie immer zweimal, bevor Sie handeln.

Schauen Sie sich auch so etwas wie https://launchpad.net/safe-rm an .

Sven
quelle
Erwähnt als root in bearbeiten
Valentin Nemcev
@Valentin: o_O !!
Jonathan Rioux
15

Der einfachste Weg, um Unfälle rm -rf /*zu vermeiden, besteht darin, jede Verwendung des rmBefehls zu vermeiden ! Tatsächlich war ich immer versucht zu rennen rm /bin/rm, um den Befehl vollständig loszuwerden! Nein, ich bin nicht scherzhaft.

Verwenden Sie stattdessen die -deleteOption des findBefehls , aber bevor Sie die Dateien löschen, empfehle ich eine Vorschau der zu löschenden Dateien:

find | less

Beachten Sie, dass in modernen Versionen von, findwenn Sie den Namen eines Verzeichnisses weglassen, implizit das aktuelle Verzeichnis verwendet wird.

find . | less

Wenn Sie sicher sind, dass dies die Dateien sind, die Sie löschen möchten, können Sie die folgende -deleteOption hinzufügen :

find path/to/files -delete

Dies ist nicht nur find sicherer, sondern auch aussagekräftiger . Wenn Sie also nur bestimmte Dateien in einer Verzeichnishierarchie löschen möchten, die mit einem bestimmten Muster übereinstimmen, können Sie einen Ausdruck wie diesen für die Vorschau verwenden und dann die Dateien löschen:

find path/to/files -name '*~' | less
find path/to/files -name '*~' -delete

Es gibt viele gute Gründe, um zu lernen und zu verwenden, findaußerdem nur einen sichereren rm. Sie werden sich also später bedanken, wenn Sie sich die Zeit nehmen, das Erlernen des Gebrauchs zu erlernen find.

aculich
quelle
Sehr interessante Diskussion. Ich mag deine Herangehensweise und habe einen kleinen Ausschnitt gemacht. Es ist super ineffizient, da es höchstens 3 mal findet, aber für mich ist das ein schöner Start: github.com/der-Daniel/fdel
Daniel Hitzel
14

Es gibt einige wirklich schlechte Ratschläge in diesem Thread, zum Glück wurde das meiste davon abgelehnt.

Wenn Sie root sein müssen, werden Sie zunächst zu root - sudo, und die verschiedenen Alias ​​- Tricks machen Sie schwach. Und schlimmer noch, sie werden dich sorglos machen. Lerne, Dinge richtig zu machen und höre auf, abhängig von Aliasnamen zu sein, um dich zu schützen. Eines Tages wirst du auf einer Kiste wurzeln, die deine Stützräder nicht hat, und etwas in die Luft jagen.

Zweitens - wenn Sie Wurzel haben, stellen Sie sich vor, Sie fahren einen Bus voller Schulkinder. Manchmal können Sie den Song im Radio rocken, aber manchmal müssen Sie in beide Richtungen schauen, die Geschwindigkeit verringern und alle Ihre Spiegel überprüfen.

Drittens - Sie kaum jemals wirklich haben rm -rf- eher möchten Sie mv something something.bakodermkdir _trash && mv something _trash/

Viertens - immer lsIhre Wildcard vorher rm- Es ist nichts Verrücktes daran, sich etwas anzuschauen, bevor es für immer zerstört wird.

eventi
quelle
2
+1 für die Verwendung von ls.
Sachin Divekar
@eventi Ich stimme zu, dass es in diesem Thread einige schreckliche Ratschläge und hässliche Hacks gibt. Es ist auf jeden Fall eine gute Idee, sich etwas anzuschauen, bevor Sie es zerstören. Es gibt jedoch eine noch bessere Möglichkeit, dies mit dem findBefehl zu tun .
ACULICH
Ich verstehe nicht, wie einfach oder sicher das Finden ist, aber ich mag Ihr find . -name '*~'Beispiel. Mein Punkt ist, dass lsderselbe Glob aufgelistet rmwird, der verwendet wird.
Eventi
11

Dies ist mein Standard speziell für reguläre Ausdrücke im Kontext von rm, aber es hätte Sie in diesem Fall gerettet.

Ich tue immer echo foo*/[0-9]*{bar,baz}*zuerst, um zu sehen, was der reguläre Ausdruck zusammenbringen wird. Sobald ich die Ausgabe habe, gehe ich dann mit der Kommandozeilenbearbeitung zurück und wechsle echozu rm -rf. Ich verwende nie, nie rm -rfauf einem ungetesteten Regexp .

MadHatter
quelle
5
OK, wonach suche ich? Wollen Sie damit sagen, dass sich die Regexp-Syntax für den Dateiabgleich von der in z. B. Perl verwendeten Syntax unterscheidet (und manchmal mit einem anderen Namen bezeichnet wird)? Oder einen anderen Punkt, den ich verpasst habe? Ich entschuldige mich für meine Langsamkeit, es ist das erste Mal, dass wir Samstagmorgen hier sind!
MadHatter
9
Diese Dinge, die Sie "regexp" nennen, sind in der Tat Klumpen. Es ist keine andere Regex-Syntax. Es ist kein Regex.
Bukzor
1
Dieses Argument könnte sicherlich gemacht werden; Aus dem Wikipedia-Artikel über reguläre Ausdrücke geht jedoch hervor, dass "viele moderne Computersysteme Platzhalterzeichen in übereinstimmenden Dateinamen aus einem Dateisystem bereitstellen. Dies ist eine Kernfunktion vieler Befehlszeilen-Shells und wird auch als Globbing bezeichnet" Die Verwendung von "auch bekannt als", was meines Erachtens darauf hinweist, dass das Aufrufen von Tokens, die Metazeichen enthalten, die mit einem oder mehreren regulären Ausdrücken für Dateinamen übereinstimmen, nicht falsch ist. Ich bin damit einverstanden, dass Globbing ein besserer Begriff ist, da es nichts anderes als die Verwendung regulärer Ausdrücke bei der Dateinamenübereinstimmung bedeutet.
MadHatter
1
@ MadHatter Globbing unterscheidet sich semantisch von regulären Ausdrücken, obwohl es sich optisch etwas ähnelt. In einem regulären Ausdruck *hat die Bedeutung von eine sehr genaue Definition, die als Kleene Star bezeichnet wird. Dabei handelt es sich um einen unären Operator, der keinem oder mehreren Elementen der Menge entspricht, auf die er angewendet wird (im Fall von regulären Ausdrücken das Zeichen oder die Zeichenmenge vor dem Kleene Star), wohingegen beim Globbing *alles im folgenden Muster übereinstimmt. Sie sind semantisch sehr unterschiedlich, auch wenn sie eine ähnliche Syntax zu haben scheinen.
ACULICH
9

Die Lösung für dieses Problem besteht darin, regelmäßige Backups zu erstellen. Immer wenn Sie etwas produzieren, das Sie nicht verlieren möchten, sichern Sie es. Wenn Sie feststellen, dass das regelmäßige Sichern zu schmerzhaft ist, vereinfachen Sie den Vorgang, damit er nicht schmerzhaft ist.

Wenn Sie beispielsweise an Quellcode arbeiten, verwenden Sie ein Tool, gitum den Code zu spiegeln und den Verlauf auf einem anderen Computer zu speichern. Wenn Sie an Dokumenten arbeiten, müssen Sie ein Skript verwenden, mit dem rsyncIhre Dokumente auf einem anderen Computer gespeichert werden.

David Schwartz
quelle
Ein Copy-on-Write-Dateisystem wie btrfs kann ebenfalls hilfreich sein. Sie können ganz einfach eine einfache automatische Snapshot-Rotation einrichten, die lokal ausgeführt wird (zusätzlich zur externen Sicherung).
17.
6

Wie bei den meisten GUIs scheint es der beste Weg zu sein, dieses Risiko zu verringern, indem Sie zweistufige Löschvorgänge durchführen. Das heißt, ersetzen Sie rm durch etwas, das Dinge in ein Papierkorbverzeichnis (auf demselben Volume) verschiebt. Reinigen Sie dann den Müll, nachdem genügend Zeit vergangen ist, um Fehler zu bemerken.

Ein solches Dienstprogramm, trash-cli, wird hier in Unix StackExchange beschrieben .

verrückt
quelle
Es ist das erste, was ich auf jeder Maschine installiere. Es sollte das Standard-Entfernungs-Tool sein, wobei rm nur verwendet wird, wenn Sie gerade etwas unbedingt entfernen müssen. Ich bin traurig, dass es noch nicht abgehoben hat, aber eines Tages wird es. Wahrscheinlich nach einer sehr öffentlichen Instanz von rm, die ein großes Problem verursachte, das nicht durch Backups hätte behoben werden können. Wahrscheinlich spielt die Zeit, die für die Erholung benötigt wird, eine große Rolle.
Gerry
+1 Nachdem ich 20 Jahre lang Linux benutzt habe, denke ich immer noch, dass es eine Art Mülleimerverhalten für geben sollte rm.
Shovas
3

Ein wichtiger Faktor, um solche Fehler zu vermeiden, ist, sich nicht mit dem Root-Konto anzumelden. Wenn Sie sich mit einem normalen, nicht privilegierten Benutzer anmelden, müssen Sie sudofür jeden Befehl verwenden. Sie sollten also vorsichtiger sein.

Khaled
quelle
4
Ich bin nicht davon überzeugt, dass sudo so etwas verhindern würde. Sie können den gleichen Tippfehler wie beim OP machen, auch wenn Sie "sudo" vor dem "rm" eingeben.
cjc
1
Erwähnt als root in bearbeiten
Valentin Nemcev
Wenn Sie immer noch nicht von der Verwendung sudound Sicherung überzeugt sind . Schauen Sie sich diese Seite an: forum.synology.com/wiki/index.php/… . Es geht um das Erstellen eines Papierkorbs. Hoffe das hilft!
Khaled
1
@ Khaled Ich verwende Sudo und Backups, ich möchte nur etwas Besseres für dieses spezielle Problem
Valentin Nemcev
3

Wenn ich ein Verzeichnis rekursiv lösche, setze ich das -rund -fgegebenenfalls das Ende des Befehls, z rm /foo/bar -rf. Auf diese Weise ist der Befehl nicht rekursiv, wenn ich versehentlich die Eingabetaste zu früh drücke, ohne den gesamten Pfad eingegeben zu haben, und daher wahrscheinlich harmlos. Wenn ich Geben Sie stoßen beim Versuch , den Schrägstrich nach eingeben /foo, habe ich geschrieben , rm /foostatt rm -rf /foo.

Das funktioniert gut auf Systemen, die GNU-Coreutils verwenden, aber die Dienstprogramme auf einigen anderen Unixen erlauben es nicht, Optionen so am Ende zu platzieren. Glücklicherweise benutze ich solche Systeme nicht sehr oft.

Wyzard
quelle
2

Es mag kompliziert sein, aber Sie können Rollen in SELinux so einrichten, dass die Möglichkeit zum Löschen von Dateien eingeschränkt ist (Sie müssen sich direkt als root anmelden, um sie zu entfernen), selbst wenn der Benutzer über sudo su - (oder plain su) root wird Dateien). Wenn Sie AppArmor verwenden, können Sie etwas Ähnliches tun .

Die andere Lösung wäre natürlich, sicherzustellen, dass Sie Backups haben. :)

Rilindo
quelle
2

Vermeiden Sie die Verwendung von Globbing . In Bash können Sie festlegen noglob. Wenn Sie jedoch zu einem System wechseln, auf dem noglobkeine Einstellungen vorgenommen wurden, können Sie dies möglicherweise vergessen und so fortfahren, als ob dies der Fall wäre.

Set noclobberzu verhindern mvund cpvon Dateien zu zerstören.

Verwenden Sie zum Löschen einen Dateibrowser. Einige Dateibrowser bieten einen Papierkorb an (z. B. Konqueror ).

Ein anderer Weg, um ein Verschlingen zu vermeiden, ist der folgende. In der Kommandozeile habe ich echo filenamepattern >> xxx. Dann bearbeite ich die Datei mit Vim oder vi, um zu überprüfen, welche Dateien gelöscht werden sollen (achte auf Dateinamenmusterzeichen in Dateimitgliedern) und verwandle dann %s/^/rm -f/jede Zeile in einen Löschbefehl. Quelle xxx. Auf diese Weise sehen Sie jede Datei, die vor dem Löschen gelöscht wird.

Verschieben Sie Dateien in ein "Dachboden" -Verzeichnis oder in einen Tarball. Oder benutze die Versionskontrolle (wie gesagt vor mir).

Andrej Panjkov
quelle
+1 für die Verwendung einer Methode zur Vorschau Ihrer Dateien, bevor Sie sie löschen. Es gibt jedoch einfachere und sicherere Möglichkeiten, dies mit dem findBefehl zu tun .
ACULICH
2

Das ZSH fragt mich (standardmäßig), bevor es eine rm -rf *.

Mathematik
quelle
1

Außerhalb von chattrgibt es nicht viele Schutzmaßnahmen, die verhindern, dass root einen solchen Befehl ausführt. Das ist der Grund, warum richtige Gruppen und sorgfältige Befehle wichtig sind, wenn Privilegierte ausgeführt werden.

Nächstes Mal; Untersuchen Sie die Dateien, die Sie löschen möchten - lassen Sie 'f' weg rm -rfoder verwenden Sie es findund übergeben Sie es anxargs rm

dünnes Eis
quelle
Es ist gut, dass Sie vorschlagen, es zu verwenden find, aber ich empfehle eine sicherere Methode, es in meiner Antwort zu verwenden . Es besteht keine Notwendigkeit zu verwenden, xargs rmda alle modernen Versionen finddie -deleteOption haben . Auch, um sicher nutzen xargs rmmüssen Sie auch verwenden find -print0und xargs -0 rmsonst wirst du Probleme haben , wenn Sie Dinge wie Dateinamen mit Leerzeichen begegnen.
ACULICH
Mein Punkt war nicht über die Nuancen über xargs, sondern mit find zuerst, ohne Dateien zu löschen und dann
fortzufahren
Ja, ich denke, dass das Scoping von Dateien mit findein guter Vorschlag ist, aber die Nuancen von xargssind wichtig, wenn Sie es vorschlagen, sonst führt es zu Verwirrung und Frustration bei Dateien mit Leerzeichen (was durch die Verwendung der -deleteOption vermieden wird ).
ACULICH
1

Einige Sicherheits-Aliase für andere Befehle, um ähnliche Katastrophen zu verhindern, finden Sie hier :

# safety features
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -I'                    # 'rm -i' prompts for every file
alias ln='ln -i'
alias chown='chown --preserve-root'
alias chmod='chmod --preserve-root'
alias chgrp='chgrp --preserve-root'

Beachten Sie die Großbuchstaben -I, sie unterscheiden sich von -i:

Eingabeaufforderung vor dem Entfernen von mehr als drei Dateien oder beim rekursiven Entfernen. Weniger aufdringlich als -i, bietet aber dennoch Schutz vor den meisten Fehlern

Valentin Nemcev
quelle
Die Option I gibt jedoch nicht wieder, was Sie löschen möchten.
Calmarius
1

Normalerweise benutze ich die -vFlagge, um zu sehen, was gelöscht wird, und habe die Chance, ^Ces im Zweifelsfall schnell zu tun. Dies ist kein wirklicher Weg, um Böses zu verhindernrm , kann jedoch nützlich sein, um den Schaden zu begrenzen, falls etwas schief geht.

a3nm
quelle
1

Mein Löschvorgang auf Unix-basierten Rechnern ist wie folgt.

  • Geben Sie ls /path/to/intented/file_or_directorydas Terminalfenster ein und drücken Sie return(oder Tab, falls gewünscht), um die Liste der Dateien anzuzeigen.

Wenn alles gut aussieht,

  • Klicken Sie auf die up arrowTaste, um ls /path/to/intented/file_or_directoryden Terminalverlauf erneut aufzurufen.

  • ersetzen lsmit rmoder rm -roder rm -rf, je nach Bedarf. Ich persönlich benutze keine -fFlagge.

Dieser Validierungsprozess verhindert auch die vorzeitige Ausführung des rmBefehls, was mir passiert ist, bevor ich diesem Prozess gefolgt bin.

Mohit Ranka
quelle
Eine Vorschau der Dateien vor dem Löschen ist eine gute Idee, und es gibt eine noch sicherere und aussagekräftigere Möglichkeit, dies mit der Option zu tun, die find ich in meiner Antwort erläutere .
ACULICH
1

Wenn Sie gerade keine Lust haben, sich neue Gewohnheiten anzueignen, sollten .bashrc/.profileSie einige Tests hinzufügen, um zu prüfen, ob Sie etwas Dummes tun. Ich dachte mir, ich könnte in einer Bash-Funktion nach einem Muster suchen, das meinen Tag ruinieren könnte, und kam auf Folgendes:

alias rm='set -f; myrm' #set -f turns off wildcard expansion need to do it outside of           
                        #the function so that we get the "raw" string.
myrm() {
    ARGV="$*"
    set +f #opposite of set -f
    if echo "$ARGV" | grep -e '-rf /*' \
                           -e 'another scary pattern'
    then
        echo "Do Not Operate Heavy Machinery while under the influence of this medication"
        return 1
    else
        /bin/rm $@
    fi
}

Das Gute daran ist, dass es nur Bash ist.

Es ist eindeutig nicht allgemein genug in dieser Form, aber ich denke, es hat Potenzial, also poste bitte einige Ideen oder Kommentare.

kln
quelle
Es ist gut, dass Sie versuchen, eine Vorschau Ihrer Dateien anzuzeigen, bevor Sie sie löschen. Diese Lösung ist jedoch zu kompliziert. Sie können dies stattdessen ganz einfach auf allgemeinere Weise mit dem findBefehl ausführen . Ich verstehe auch nicht, warum Sie sagen, "das Gute daran ist, dass es nur Bash ist"? Es wird empfohlen, Bash-Ismen in Skripten zu vermeiden .
ACULICH
Um zu verhindern, dass wir "rm -rf / *" oder "rm -rf dir / *", wenn wir "rm -rf ./*" und "rm -rf dir / *" meinen, müssen wir die Muster "/ *" erkennen. und "*" (vereinfacht). Wir können jedoch nicht alle Befehlszeilenargumente über grep übergeben, um nach schädlichen Mustern zu suchen, da bash die Platzhalterargumente vor der Weitergabe erweitert (star wird auf den gesamten Inhalt eines Ordners erweitert). Wir brauchen den "raw" -Argumentstring. Dies geschieht mit set -f, bevor wir die "myrm" -Funktion aufrufen, die dann den raw-Argumentstring übergibt und grep nach vordefinierten Mustern sucht. *
kln
Ich verstehe, was Sie versuchen, mit set -fdem, was set -o noglobin Bash gleichwertig ist , zu tun , aber das erklärt immer noch nicht Ihre Aussage, dass "das Gute daran ist, dass es nur Bash ist". Stattdessen können Sie das Problem für jede Shell vollständig und allgemein beseitigen, indem Sie überhaupt nicht verwenden rm, sondern den findBefehl verwenden . Haben Sie diesen Vorschlag tatsächlich ausprobiert, um zu sehen, wie er mit dem verglichen wird, was Sie hier vorschlagen?
ACULICH
@aculich mit nur bash meine ich keine python oder perl abhängigkeiten, alles kann in bash gemacht werden. Sobald ich meine .bashrc-Datei geändert habe, kann ich weiterarbeiten, ohne alte Gewohnheiten aufgeben zu müssen. Jedes Mal, wenn ich rm bash aufrufe, stelle ich sicher, dass ich nichts Dummes tue. Ich muss nur einige Muster definieren, auf die ich aufmerksam gemacht werden möchte. Wie "*", das alles aus dem aktuellen Ordner entfernt. Immer wieder ist dies genau das, was ich möchte, aber mit ein bisschen mehr Arbeitsinteraktivität kann "myrm" hinzugefügt werden.
kln
@aculich OK gotcha.No Ich habe es nicht ausprobiert. Ich denke, es erfordert erhebliche Änderungen im Workflow. Gerade hier auf Mac OS X überprüft, ist meine .bash_history 500 und 27 dieser Befehle sind rm. Und heutzutage benutze ich ein Terminal nicht sehr oft.
kln
1

Leider kann ich oben keinen Kommentar abgeben, da das Karma nicht ausreicht, aber ich wollte andere warnen, dass safe-rm kein Allheilmittel für versehentliche Albträume der Massenlöschung ist.

Das Folgende wurde in einer virtuellen Linux Mint 17.1-Maschine getestet (Warnung für diejenigen, die mit diesen Befehlen nicht vertraut sind: TUN SIE DAS NICHT! Selbst diejenigen, die mit diesen Befehlen vertraut sind, sollten / würden dies wahrscheinlich niemals tun, um einen katastrophalen Datenverlust zu vermeiden):

Textversion (gekürzt):

$ cd /
$ sudo safe-rm -rf *
$ ls
bash: /bin/ls: No such file or directory

Bildversion (voll):

Bildbeschreibung hier eingeben

Miles Wolbe
quelle
1

Ich mag den Windows-Ansatz des Papierkorbs.

Normalerweise erstelle ich ein Verzeichnis mit dem Namen "/ tmp / recyclebin" für alles, was ich löschen muss:

mkdir /tmp/recyclebin

Und benutze nie rm -rf, ich benutze immer:

mv target_folder /tmp/recyclebin

Später entleere ich den Papierkorb mithilfe eines Skripts oder manuell.

Basilikum A
quelle
0

Hehe (ungetestet und etwas scherzhaft!):

$ cat /usr/local/bin/saferm

#! /bin/bash

/bin/ls -- "$@"

echo "Those be the files you're about to delete."
echo "Do you want to proceed (y/N)?"

read userresponse

if [ "$userresponse" -eq "y" ]; then

  echo "Executing...."
  /bin/rm -- "$@"

fi

Und dann:

alias rm="/usr/local/bin/saferm"

Realistischerweise sollten Sie eine mentale Pause einlegen, bevor Sie diese Art von Operation mit einem Glob ausführen, unabhängig davon, ob Sie als Root ausgeführt werden, "sudo" voranstellen usw. Sie können ein "ls" auf demselben Glob ausführen usw. Aber im Geiste sollten Sie eine Sekunde innehalten, sicherstellen, dass Sie das eingegeben haben, was Sie wollten, dass das, was Sie wollen, tatsächlich das ist, was Sie wollen usw. Ich nehme an, dies ist etwas, das hauptsächlich durch Zerstörung von etwas im ersten Jahr als gelernt wurde eine Unix SA, in der gleichen Weise, wie der heiße Brenner ein guter Lehrer ist, der Ihnen mitteilt, dass etwas auf dem Herd heiß sein kann.

Und stellen Sie sicher, dass Sie gute Backups haben!

cjc
quelle
Ich überlege es mir zweimal, bevor ich gefährliche Dinge tue, aber irgendwie funktioniert es nicht immer. Ich habe etwas in der Vergangenheit zerstört, weil ich so unaufmerksam war.
Valentin Nemcev
0

Nicht als Schutzmaßnahme, sondern um herauszufinden, welche Dateien gelöscht wurden, bevor Sie auf ^ C geklickt haben, können Sie die locateDatenbank verwenden (natürlich nur, wenn sie installiert und überlebt wurde rm).

Ich habe davon in diesem Blog-Beitrag erfahren

Valentin Nemcev
quelle
0

Verwenden Sie einfach ZFS, um die Dateien zu speichern, die Sie benötigen, um ein versehentliches Entfernen zu verhindern, und haben Sie einen Daemon, der:

  • erstellt regelmäßig Snapshots dieses Dateisystems
  • Entfernt ältere / unnötige Schnappschüsse.

Sollten Dateien entfernt, überschrieben oder beschädigt werden, führen Sie einfach ein Rollback Ihres Dateisystems auf einen Klon des letzten guten Schnappschusses durch, und Sie sind fertig.

jlliagre
quelle
0

nicht so sehr eine antwort, sondern ein tipp, das tue ich immer rm (dir) -rfnicht rm -rf (dir).

Es hilft dabei, Situationen, in denen Sie den Namen des Verzeichnisses fett abtasten, so zu entschärfen, dass es sich immer noch um eine gültige Löschung handelt, z.

Sirex
quelle
Schlau, würde aber auf BSD nicht funktionieren rm, wo Optionen vor Dateinamen stehen müssen.
svenper
Ja. Das habe ich kürzlich mit Apple's herausgefunden. Die Lösung besteht darin, die Gnu-Tools zu installieren und Aliase für alles zu setzen :) und / oder den Apfel vorzugsweise in einen Mülleimer zu werfen. :)
Sirex
1
Wenn es mir erlaubt wäre, würde ich es in einer Nanosekunde tun. Es ist Müll im Vergleich zu Linux.
Sirex
0

Ich halte dies für einen leistungsstarken Präventionstipp mit der * -Erweiterungsverknüpfung in der Shell:

Geben Sie zuerst rm -rf *oder rm -rf your/path/*NICHT ein Enter. (Natürlich sollten Sie es sich zur Gewohnheit machen, bei der Verwendung nicht schnell / versehentlich die Eingabetaste zu drücken. rm -rf)

Drücken Sie dann Alt-Shift-8(dh Alt-Shift-*), um den Platzhalter "*" explizit in bash zu erweitern. Dies vermeidet auch die erneute Eingabe eines "rm -rf *" - Befehls beim Navigieren im Verlauf.

Nachdem Sie überprüft haben, ob die Erweiterung die richtigen Dateien / Verzeichnisse enthält, drücken Sie die Eingabetaste.

Getan.

Johnny Wong
quelle
0

Für den Fall, dass dies jemandem in seinem eigenen Fall hilft:

1. Verwenden Sie rmsafe:

Es verschiebt Dateien in einen "Papierkorb" -Ordner und Sie haben immer die Möglichkeit, sie mit einem einfachen Befehl zurückzubringen mv:

$ rmsafe /path/to/important/files

Quelle: https://github.com/pendashteh/rmsafe

2. Verwenden Sie safe:

Sie können einen Alias ​​für die rmVerwendung von safe festlegen :

$ alias rm="safe rm"

Wenn Sie jetzt laufen, erhalten rm /*Sie diese Antwort:

$ rm /*
Are you sure you want to 'rm /bin /boot /data /dev /etc /home /initrd.img /lib /lib64 /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var'? [y/n]

und ich glaube du wirst nicht tippen y!

Quelle: https://github.com/pendashteh/safe

Alexar
quelle