Frage Wie verhindere ich versehentlich rm -rf / *?


Ich bin gerade gelaufen rm -rf /* versehentlich, aber ich meinte es rm -rf ./* (Bemerke den Stern nach dem Schrägstrich).

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


Ich war nicht root und annullierte den Befehl sofort, aber es gab einige entspannte Berechtigungen irgendwo oder etwas, weil ich bemerkte, dass mein Bash-Prompt bereits brach. Ich möchte mich nicht auf Berechtigungen verlassen und nicht root sein (ich könnte denselben Fehler machen) sudo), und ich möchte nicht nach mysteriösen Fehlern suchen, weil irgendwo im System eine Datei fehlt, also Backups und sudo sind gut, aber ich möchte etwas besser für diesen speziellen Fall.


Über zweimal denken und das Gehirn benutzen. Ich benutze es tatsächlich! Aber ich benutze es, um eine komplexe Programmieraufgabe mit 10 verschiedenen Dingen zu lösen. Ich bin tief in diese Aufgabe vertieft, es gibt keine Gehirnkraft mehr für die Überprüfung von Flaggen und Pfaden, ich denke nicht einmal in Bezug auf Befehle und Argumente, ich denke in Bezug auf Aktionen wie "leeres aktuelles Verzeichnis", 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.


156
2017-12-02 17:09


Ursprung


Zu Ihrer Information, Sie können auch tun rm -rf . /mydir anstatt rm -rf ./mydir und töte das Verzeichnis, in dem du warst. Ich finde, das passiert öfter. - user606723
Um eine Waffenanalogie zu verwenden, sagt diese Frage, bitte macht die Waffe zu erkennen, dass ich auf meinen Fuß ziele und nicht feuere, aber ich will nicht dafür verantwortlich sein, die Waffe nicht auf meinen Fuß zu richten. Waffen und Computer sind dumm und wenn du etwas Dummes tust, dann wirst du diese Ergebnisse bekommen. Wenn man der Waffenanalogie folgt, wird nichts davon abhalten, sich selbst zu verletzen, außer Wachsamkeit und Übung. - slillibri
@slillibri Außer das rm ist keine Waffe, es ist ein Computerprogramm, es könnte Seien Sie schlau genug, um zu bestimmen, dass der Benutzer einige wichtige Dateien löschen und eine Warnung ausgeben wird (wie es tatsächlich der Fall ist, wenn Sie es versuchen) rm -rf / ohne Stern). - Valentin Nemcev
@slillibri Gewehre haben Sicherheiten. Fragen, wie man bessere Sicherheiten auf die rm Befehl ist eine vollkommen legitime Sysadmin-Frage. - Gilles
sudo rm / bin / rm nicht empfohlen, aber wird die meisten rms verhindern :-) - Paul


Antworten:


Einer der Tricks, denen ich folge, ist zu setzen # am Anfang beim Benutzen der rm Befehl.

root@localhost:~# #rm -rf /

Dies verhindert eine versehentliche Ausführung von rm auf der falschen Datei / Verzeichnis. Sobald bestätigt, entfernen # von Anfang an. Dieser Trick funktioniert, denn in Bash beginnt ein Wort mit # bewirkt, dass das Wort und alle verbleibenden Zeichen in dieser Zeile ignoriert werden. Also wird der Befehl einfach ignoriert.

ODER

Wenn Sie ein wichtiges Verzeichnis verhindern wollen, gibt es noch einen Trick.

Erstellen Sie eine Datei mit dem Namen -i in diesem Verzeichnis. Wie kann solch eine seltsame Datei erstellt werden? Verwenden touch -- -i oder touch ./-i

Jetzt versuche es 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 die * wird sich erweitern -i zur Befehlszeile, so wird Ihr Befehl schließlich rm -rf -i. Daher wird der Befehl vor dem Entfernen angezeigt. Sie können diese Datei in Ihre /, /home/, /etc/, usw.

ODER

Benutzen --preserve-root als eine Option zu rm. In dem rm in neueren enthalten coreutils Pakete, ist diese Option die Standardeinstellung.

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

ODER

Benutzen sicher-rm

Auszug aus der Website:

Safe-rm ist ein Sicherheitswerkzeug, das das versehentliche Löschen verhindern soll   wichtiger Dateien durch Ersetzen von / bin / rm durch einen Wrapper, der prüft   die angegebenen Argumente gegen eine konfigurierbare Blacklist von Dateien und   Verzeichnisse, die nie entfernt werden sollten.

Benutzer, die versuchen, eine dieser geschützten Dateien oder   Verzeichnisse können dies nicht und es wird eine Warnung angezeigt   Nachricht stattdessen:

$ rm -rf /usr
Skipping /usr

215
2017-12-02 23:36



safe-rm sieht sehr gut aus, schaut es jetzt an ... - Valentin Nemcev
Safe-RM ist ordentlich. Auch das ist ein raffinierter Trick mit dem -i Datei. Hah. Dummer Bash. - EricR
Erstaunlich, was für ein Trick in Unix gemacht wird. - WernerCD
Die Erstellungsdatei namens -i ist absolut genial. Ich hätte das vor etwa einem Jahr nutzen können, als ich zufällig eine rm -rf / etc / * auf VPS lief ... (glücklicherweise mache ich nächtliche Schnappschüsse, also konnte ich in weniger als 45 Minuten wiederherstellen). - David W
Es ist Genie. Zauberei wäre touch -- -rf - Mircea Vutcovici


Ihr Problem:

Ich rannte einfach rm -rf / * aus Versehen, aber ich meinte rm -rf ./* (bemerke den Stern nach dem Schrägstrich).

Die Lösung: Tu das nicht! In der Praxis nicht verwenden ./ am Anfang eines Pfades. Die Schrägstriche fügen dem Befehl keinen Wert hinzu und verursachen nur Verwirrung.

./*bedeutet das Gleiche wie *, so ist der obige Befehl besser geschrieben als:

rm -rf *

Hier ist ein ähnliches Problem. Ich sehe oft den folgenden Ausdruck, wo jemand das vermutet hat FOO ist auf etwas wie eingestellt /home/puppies. Ich habe das gerade heute in der Dokumentation eines großen Softwareanbieters gesehen.

rm -rf $FOO/

Aber falls FOO ist nicht festgelegt, wird dies ausgewertet werden rm -rf /, die versucht, alle Dateien auf Ihrem System zu entfernen. Der abschließende Schrägstrich ist unnötig, daher sollte er aus praktischen Gründen nicht verwendet werden.

Das Folgende wird dasselbe tun und ist weniger wahrscheinlich, Ihr System zu beschädigen:

rm -rf $FOO

Ich habe diese Tipps auf die harte Tour gelernt. Als ich vor 14 Jahren meinen ersten Superuser-Account hatte, lief ich ausversehen rm -rf $FOO/ aus einem Shell-Skript heraus und zerstört ein System. Die 4 anderen Systemadministratoren sahen sich das an und sagten: "Yup. Jeder macht das einmal. Jetzt ist hier dein Installationsmedium (36 Disketten). Geh und reparier es.

Andere Leute hier empfehlen Lösungen wie --preserve-root und safe-rm. Diese Lösungen sind jedoch nicht für alle Un * xe-varients verfügbar und funktionieren möglicherweise nicht unter Solaris, FreeBSD und MacOSX. In Ergänzung, safe-rm erfordert, dass Sie zusätzliche Pakete auf jedem einzelnen Linux-System installieren, das Sie verwenden. Wenn Sie sich darauf verlassen safe-rmWas passiert, wenn Sie einen neuen Job beginnen und nicht haben? safe-rm Eingerichtet? Diese Tools sind eine Krücke, und es ist viel besser, sich auf bekannte Fehlerquellen zu verlassen und Ihre Arbeitsgewohnheiten zu verbessern.


42
2017-12-02 18:58



Mein Freund hat mir gesagt, dass er nie benutzt rm -rf *. Er ändert immer zuerst das Verzeichnis und verwendet ein bestimmtes Ziel. Der Grund ist, dass er die Geschichte der Granate oft benutzt und er befürchtet, dass ein solcher Befehl in seiner Geschichte zur falschen Zeit auftauchen könnte. - haggai_e
@haggai_e: Guter Tipp. Als ich neu bei Unix war, rannte ich einmal in einen Bug wo rm -rf * auch entfernt . und ... Ich war root, und dies durchlief die unteren Verzeichnisse wie ../../..und war ziemlich destruktiv. Ich versuche sehr vorsichtig zu sein rm -rf * seitdem. - Stefan Lasiewski
rm -rf $FOO wird nicht helfen, wenn Sie müssen rm -rf $FOO/$BAR. cd $FOO && rm -rf $BAR wird helfen, obwohl es viel länger ist. - Victor Sergienko
@VictorSergienko, mit Bash, wie wäre es zu spezifizieren ${FOO:?}, wie in rm -rf ${FOO:?}/ und rm -rf ${FOO:?}/${BAR:?}. Es wird verhindern, dass es jemals in rm -rf /. Ich habe mehr Informationen darüber in meiner Antwort Hier. - A-B-B
@haggai_e: Ich finde das eines der besten Tipps zu diesem Thema. Ich verbrannte meinen Finger mit rm -rf *in einer for-Schleife, die aus Versehen in das falsche Verzeichnis wechselte und etwas anderes löschte. Wenn ich ein bestimmtes Ziel verwendet hätte, hätte es viel kleinere Chancen, das falsche Ding zu löschen. - richk


Da dies auf "Serverfault" steht, möchte ich Folgendes sagen:

Wenn du Dutzende oder mehr Server hast, mit einem größeren Team von Admins / Benutzern, jemand wird rm -rf oder chown das falsche Verzeichnis.

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


30
2017-12-02 20:42



Und Sie sollten eine VM oder Ersatzbox verwenden, um Wiederherstellungen zu üben - finden Sie heraus, was nicht funktioniert hat, und verfeinern Sie den Plan. Wir machen einen 14-tägigen Neustart - weil es in unserem Gebäude Stromausfälle gab und jedes Mal, wenn es schmerzhaft war. Indem wir ein paar geplante Shutdowns für alle Racks durchgeführt haben, haben wir es von ein paar Tagen Laufzeit auf etwa 3 Stunden reduziert - jedes Mal lernen wir, welche Bits für init.d-Skripte usw. zu automatisieren / reparieren sind. - Danny Staple
Und versuchen Sie diesen Befehl auf einer VM. Es ist interessant! Aber machen Sie zuerst einen Schnappschuss. - Stefan Lasiewski


Die besten Lösungen beinhalten die Änderung Ihrer Gewohnheiten, nicht zu verwenden rm direkt.

Ein Ansatz besteht darin, zu laufen echo rm -rf /stuff/with/wildcards* zuerst. Überprüfen Sie, ob die Ausgabe der Platzhalter sinnvoll erscheint, und verwenden Sie dann den Verlauf der Shell, um den vorherigen Befehl ohne den Befehl auszuführen echo.

Ein anderer Ansatz ist die Begrenzung der echo Befehl zu Fällen, in denen es offensichtlich ist, was Sie löschen werden. Entfernen Sie nicht alle Dateien in einem Verzeichnis, sondern entfernen Sie das Verzeichnis und erstellen Sie ein neues Verzeichnis. Eine gute Methode ist das Umbenennen des vorhandenen Verzeichnisses in DELETE-foo, dann erstellen Sie ein neues Verzeichnis foo mit entsprechenden Berechtigungen und schließlich entfernen DELETE-foo. Ein Nebeneffekt dieser Methode ist, dass der Befehl, der in Ihrem Verlauf eingegeben wurde, ist 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 Sie das Verzeichnis behalten müssen (weil es immer existieren 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

(Hit das Alt+. Schlüssel.)

Ein Verzeichnis von innen zu löschen wäre attraktiv, weil rm -rf . ist kurz und hat daher ein geringes Tippfehlerrisiko. Typische Systeme lassen das leider nicht zu. Sie können zu rm -rf -- "$PWD" stattdessen mit einem höheren Risiko von Tippfehlern, aber die meisten von ihnen führen dazu, nichts zu entfernen. Beachten Sie, dass dies einen gefährlichen Befehl in Ihrer Shell-Historie hinterlässt.

Wann immer Sie können, verwenden Sie die Versionskontrolle. Du nicht rm, Sie cvs rm oder was auch immer, und das ist unwiderruflich.

Zsh verfügt über Optionen, um Sie vor dem Ausführen aufzufordern rm mit einem Argument, das alle Dateien in einem Verzeichnis auflistet: rm_star_silent (standardmäßig aktiviert) wird vor der Ausführung aufgefordert 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 alle Dateien in einem Verzeichnis entfernen möchten, da Sie die Eingabeaufforderung bereits erwarten. Es kann helfen, Tippfehler wie zu verhindern rm foo * zum rm foo*.

Es gibt viele weitere Lösungen, die dazu beitragen, die rm Befehl. Eine Einschränkung dieses Ansatzes besteht darin, dass Sie eines Tages auf einer Maschine mit dem Real sein werden rm und du rufst automatisch an rm, sicher in Ihrer Erwartung einer Bestätigung ... und als nächstes werden Sie Backups wiederherstellen.


23
2017-12-02 22:33



mv -t DELETE_ME -- * ist ein bisschen narrensicherer. - Tobu
@Giles Nicht verwenden rm direkt ist ein guter Rat! Eine noch bessere Alternative ist benutze die find Befehl. - aculich
Und wenn Sie das Verzeichnis behalten möchten, können Sie das ganz einfach mit. Tun find somedir -type f -delete wodurch alle Dateien gelöscht werden somedir aber wird das Verzeichnis und alle Unterverzeichnisse verlassen. - aculich


Du könntest immer einen Alias ​​machen, wie du erwähnt hast:

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önnten es auch mit einem Commandline-Twitter-Client integrieren, um Ihre Freunde darüber zu informieren, wie Sie sich fast selbst gedemütigt haben, indem Sie Ihre Festplatte mit gelöscht haben rm -fr /* als root.


18
2017-12-02 17:16



+1 für telnet miku.acm.uiuc.edu - Ali
alias echo = "telnet miku.acm.uiuc.edu" - kubanczyk
Ich muss 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 du so paranoid bist wie du sein solltest, lauf in einer VM. - Naftuli Kay
-1 Sie können keine Alias-Befehle mit Leerzeichen in ihnen verwenden, geschweige denn / *, was ein ungültiger Name ist - xenithorb


Ja: Arbeite nicht als root und denke immer zweimal nach, bevor du handelst.

Sehen Sie sich auch etwas an https://launchpad.net/safe-rm.


15
2018-02-26 05:50



Erwähnt, als root in Bearbeitung zu arbeiten - Valentin Nemcev
@Valentin: o_O !! - Jonathan Rioux


Der einfachste Weg, um versehentliche zu verhindern rm -rf /* ist es, alle Nutzung der zu vermeiden rm Befehl! Tatsächlich war ich immer versucht zu rennen rm /bin/rm um den Befehl vollständig loszuwerden! Nein, ich bin nicht witzig.

Verwenden Sie stattdessen die -delete Option der find Befehl, aber bevor Sie die Dateien löschen, empfehle ich eine Vorschau, welche Dateien Sie löschen werden:

find | less

Beachten Sie, in modernen Versionen von find Wenn Sie den Namen eines Verzeichnisses weglassen, verwendet es implizit das aktuelle Verzeichnis. Das obige entspricht also:

find . | less

Sobald Sie sicher sind, dass dies die Dateien sind, die Sie löschen möchten, können Sie die Datei hinzufügen -delete Möglichkeit:

find path/to/files -delete

Also nicht nur find  sicherer zu verwenden, ist es auch ausdrucksstärkerWenn Sie also nur bestimmte Dateien in einer Verzeichnishierarchie löschen möchten, die einem bestimmten Muster entsprechen, können Sie einen solchen Ausdruck zur 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 zu lernen und zu verwenden find außerdem nur ein sicherer rm, also wirst du dir später selbst danken, wenn du dir die Zeit nimmst zu lernen find.


15
2017-12-03 22:44



Sehr interessante Diskussion. Ich mag deine Annäherung und machte ein kleines Stückchen. Es ist sehr ineffizient, da es Aufrufe höchstens 3 mal findet, aber für mich ist das ein schöner Anfang: github.com/der-Daniel/fdel - Daniel Hitzel


Es gibt einige wirklich schlechte Ratschläge in diesem Thread, glücklicherweise wurde das meiste davon abgelehnt.

Wenn Sie root werden müssen, werden Sie root - sudo und die verschiedenen Alias-Tricks werden Sie schwach machen. Und schlimmer noch, sie machen dich sorglos. Lernen Sie, die Dinge richtig zu machen, hören Sie auf, abhängig von Aliasen, um Sie zu schützen. Eines Tages wurdest du auf einer Kiste verwurzelt, die deine Trainingsräder nicht hat und etwas in die Luft jagt.

Zweitens - wenn Sie Wurzel haben, denken Sie an sich selbst als einen Bus voller Schulkinder fahren. Manchmal kann man im Radio zu dem Song rocken, aber manchmal muss man in beide Richtungen schauen, die Dinge langsamer machen und alle Spiegel überprüfen.

Drittens - Sie fast nie Ja wirklich müssen, zu ... haben rm -rf - Wahrscheinlicher Sie möchten mv something something.bak oder mkdir _trash && mv something _trash/

Viertens - immer ls Dein Platzhalter vorher rm - Es ist nichts verrücktes, etwas zu betrachten, bevor es für immer zerstört wird.


14
2017-12-02 19:57



+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. Und es ist definitiv eine gute Idee, etwas zu betrachten, bevor man es zerstört, aber da ist ein noch besserer Weg, das zu tun mit dem find Befehl. - aculich
Ich sehe nicht, wie Finden einfacher oder sicherer ist, aber ich mag dein find . -name '*~' Beispiel. Mein Punkt ist das ls wird den gleichen glob auflisten rm wird benutzen. - eventi


Dies ist Standard von mir speziell für Regexps im Zusammenhang mit RM, aber es hätte dich in diesem Fall gerettet.

mache ich immer echo foo*/[0-9]*{bar,baz}* Erstens, um zu sehen, was die Regexp wird zusammenpassen. Sobald ich die Ausgabe habe, gehe ich dann mit der Befehlszeilenbearbeitung zurück und ändere echo zu rm -rf. ich niemals benutzen rm -rf auf einem ungeprüften Regexp.


11
2017-12-02 19:05



Bitte vergleichen Sie: linuxmanpages.com/man3/regex.3.php  linuxmanpages.com/man3/glob.3.php - bukzor
OK, wonach suche ich? Machst du den Punkt, dass die Regexp-Syntax für Datei-Matching anders ist (und manchmal mit einem anderen Namen aufgerufen wird) als das, was in zB Perl verwendet wird? Oder einen anderen Punkt, den ich verpasst habe? Ich entschuldige mich für meine Langsamkeit der Gedanken, es ist das erste, was Samstagmorgen hier ist! - MadHatter
Diese Dinge, die du "Regexp" nennst, sind in Wirklichkeit Klumpen. Es ist keine andere Regex-Syntax; es ist keine Regex. - bukzor
Dieses Argument könnte sicherlich gemacht werden; Aus dem Wikipedia-Artikel über reguläre Ausdrücke geht jedoch hervor: "Viele moderne Computersysteme stellen Platzhalterzeichen in übereinstimmenden Dateinamen aus einem Dateisystem zur Verfügung. Dies ist eine Kernfunktion vieler Kommandozeilen-Shells und wird auch als globbing bezeichnet" Verwendung von "auch bekannt als", was mir zu zeigen scheint, dass das Aufrufen von Token, die Metazeichen enthalten, um mit einem oder mehreren Dateinamen regulär zu übereinstimmen, nicht falsch ist. Ich stimme zu, dass Globbing ein besserer Begriff ist, weil es nichts anderes bedeutet als die Verwendung von regulären Ausdrücken beim Filtern von Dateinamen. - MadHatter
@MadHatter Überprüfen, um zu sehen, welche Dateien übereinstimmen, bevor Sie sie löschen, ist ein guter Rat, aber es gibt ein sicherere und ausdrucksvollere Weise, es mit dem zu tun find Befehl. - aculich