Lösung 1:
Einer der Tricks, denen ich folge, ist das Einfügen von #
am Anfang mit der rm
Befehl.
[email protected]:~# #rm -rf /
Dies verhindert die versehentliche Ausführung von rm
auf die falsche Datei/Verzeichnis. Entfernen Sie nach der Überprüfung #
von Anfang an. Dieser Trick funktioniert, weil 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 wichtige Verzeichnisse verhindern möchten, gibt es noch einen Trick.
Erstellen Sie eine Datei namens -i
in diesem Verzeichnis. Wie kann eine so seltsame Datei erstellt werden? Mit touch -- -i
oder touch ./-i
Versuchen Sie jetzt rm -rf *
:
[email protected]:~$ touch {1..4}
[email protected]:~$ touch -- -i
[email protected]:~$ ls
1 2 3 4 -i
[email protected]:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'?
Hier die *
wird -i
erweitern an die Befehlszeile, sodass Ihr Befehl letztendlich zu rm -rf -i
wird . Daher wird der Befehl vor dem Entfernen aufgefordert. Sie können diese Datei in Ihren /
einfügen , /home/
, /etc/
usw.
ODER
Verwenden Sie --preserve-root
als Option zu rm
. Im rm
in neuerem coreutils
enthalten Pakete, diese Option ist 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 es /bin/rm durch einen Wrapper ersetzt, der die angegebenen Argumente gegen eine konfigurierbare schwarze Liste von Dateien und Verzeichnissen prüft, die niemals entfernt werden sollten.
Benutzer, die versuchen, eine dieser geschützten Dateien oder Verzeichnisse zu löschen, können dies nicht tun und erhalten stattdessen eine Warnmeldung:
$ rm -rf /usr
Skipping /usr
Lösung 2:
Ihr Problem:
Ich habe gerade versehentlich rm -rf /* ausgeführt, aber ich meinte rm -rf ./* (beachten Sie den Stern nach dem Schrägstrich).
Die Lösung:Tu das nicht! Verwenden Sie aus praktischen Gründen ./
nicht am Anfang eines Weges. Die Schrägstriche fügen dem Befehl keinen Wert hinzu und stiften nur Verwirrung.
./*
bedeutet dasselbe wie *
, also wird der obige Befehl besser geschrieben als:
rm -rf *
Hier ist ein verwandtes Problem. Ich sehe oft den folgenden Ausdruck, wo jemand angenommen hat, dass FOO
auf so etwas wie /home/puppies
gesetzt ist . Ich habe das gerade heute in der Dokumentation eines großen Softwareanbieters gesehen.
rm -rf $FOO/
Aber wenn FOO
nicht gesetzt ist, wird dies zu rm -rf /
ausgewertet , der versucht, alle Dateien auf Ihrem System zu entfernen. Der abschließende Schrägstrich ist unnötig, verwenden Sie ihn daher aus Übungsgründen nicht.
Folgendes bewirkt dasselbe und beschädigt Ihr System weniger wahrscheinlich:
rm -rf $FOO
Ich habe diese Tipps auf die harte Tour gelernt. Als ich vor 14 Jahren mein erstes Superuser-Konto hatte, führte ich versehentlich rm -rf $FOO/
aus aus einem Shell-Skript heraus und zerstörte ein System. Die 4 anderen Systemadministratoren sahen sich das an und sagten:„Yup. Das macht jeder einmal. Hier sind nun Ihre Installationsmedien (36 Disketten). Repariere es.'
Andere hier empfehlen Lösungen wie --preserve-root
und safe-rm
. Diese Lösungen sind jedoch nicht für alle Un*xe-Varianten vorhanden und funktionieren möglicherweise nicht unter Solaris, FreeBSD und MacOSX. Außerdem safe-rm
erfordert, dass Sie zusätzliche Pakete auf jedem einzelnen Linux-System installieren, das Sie verwenden. Wenn Sie sich auf safe-rm
verlassen , was passiert, wenn Sie einen neuen Job beginnen und sie nicht safe-rm
haben Eingerichtet? Diese Tools sind eine Krücke, und es ist viel besser, sich auf bekannte Standardeinstellungen zu verlassen und Ihre Arbeitsgewohnheiten zu verbessern.
Lösung 3:
Da dies auf "Serverfault" steht, möchte ich Folgendes sagen:
Wenn Sie Dutzende oder mehr Server haben, mit einem größeren Team von Administratoren/Benutzern, jemand geht zu rm -rf
oder chown
das falsche Verzeichnis.
Sie sollten einen Plan haben, um den betroffenen Dienst mit der geringstmöglichen MTTR wieder in Betrieb zu nehmen.
Lösung 4:
Die beste Lösung besteht darin, Ihre Gewohnheiten zu ändern und rm
nicht zu verwenden direkt.
Ein Ansatz besteht darin, echo rm -rf /stuff/with/wildcards*
auszuführen Erste. Überprüfen Sie, ob die Ausgabe der Platzhalter vernünftig aussieht, und verwenden Sie dann den Verlauf der Shell, um den vorherigen Befehl ohne echo
auszuführen .
Ein anderer Ansatz besteht darin, den echo
einzuschränken Befehl zu Fällen, in denen es blendend offensichtlich ist, was Sie löschen werden. Anstatt alle Dateien in einem Verzeichnis zu entfernen, entfernen Sie das Verzeichnis und erstellen Sie ein neues. Eine gute Methode besteht darin, das vorhandene Verzeichnis in DELETE-foo
umzubenennen , erstellen Sie dann ein neues Verzeichnis foo
mit den entsprechenden Berechtigungen und schließlich DELETE-foo
entfernen . Ein Nebenvorteil dieser Methode ist, dass der Befehl, der in Ihren Verlauf eingegeben wird, rm -rf DELETE-foo
ist .
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 soll (weil es immer existieren muss oder weil Sie nicht die Berechtigung hätten, 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 Alt +. Schlüssel.)
Das Löschen eines Verzeichnisses von innen wäre attraktiv, weil rm -rf .
ist kurz und hat daher ein geringes Tippfehlerrisiko. Typische Systeme lassen das leider nicht zu. Sie können bis rm -rf -- "$PWD"
stattdessen mit einem höheren Risiko von Tippfehlern, 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.
Verwenden Sie nach Möglichkeit die Versionskontrolle. Sie nicht rm
, Sie cvs rm
oder was auch immer, und das ist rückgängig zu machen.
Zsh hat Optionen, um Sie vor dem Ausführen von rm
zu benachrichtigen mit einem Argument, das alle Dateien in einem Verzeichnis auflistet:rm_star_silent
(standardmäßig aktiviert) fordert vor der Ausführung von rm whatever/*
auf 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 beabsichtigten, alle Dateien in einem Verzeichnis zu entfernen, da Sie die Eingabeaufforderung bereits erwarten. Es kann helfen, Tippfehler wie rm foo *
zu vermeiden für rm foo*
.
Es gibt viele weitere Lösungen, die eine Änderung des rm
erfordern Befehl. Eine Einschränkung dieses Ansatzes besteht darin, dass Sie sich eines Tages auf einer Maschine mit dem echten rm
befinden werden und Sie rufen automatisch rm
an , sicher in Ihrer Erwartung einer Bestätigung … und als nächstes werden Sie Backups wiederherstellen.
Lösung 5:
Sie könnten immer einen Alias verwenden, wie Sie 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önnten es auch in einen Befehlszeilen-Twitter-Client integrieren, um Ihre Freunde darüber zu informieren, wie Sie sich fast selbst gedemütigt hätten, indem Sie Ihre Festplatte mit rm -fr /*
gelöscht haben als Wurzel.