Nachdem ich den berüchtigten Fehler begangen hatte, mein gesamtes Dateisystem über zu löschen sudo rm -rf /*
, den schrecklichen Schaden, den ich angerichtet hatte, zu beheben und die Tatsache zu bewältigen, dass ich gerade 6 Jahre meines Lebens verloren hatte, begann ich mich zu fragen, warum es überhaupt möglich ist, dies zu tun Was kann getan werden, um diesen Fehler zu verhindern?
Eine Lösung, die mir vorgeschlagen wurde, ist das Sperren des Root-Zugriffs von meinem Konto aus, was jedoch unpraktisch ist, da viele Befehle den Root-Zugriff erfordern und es ärgerlich wird, wenn Sie täglich ein paar Dutzend Befehle ausführen müssen.
Das Sichern Ihres Systems ist der naheliegende Weg. Das Wiederherstellen eines Backups erfordert jedoch auch einige Ausfallzeiten. Abhängig von Ihrem System können Ausfallzeiten Tage oder Wochen betragen, die in einigen Fällen inakzeptabel sein können.
Meine Frage ist: Warum nicht eine Bestätigung implementieren, wenn der Benutzer versucht, sein Dateisystem zu löschen? Wenn Sie das also wirklich wollen, drücken Sie einfach Y oder die Eingabetaste, und wenn Sie das nicht tun, verlieren Sie nicht alles.
quelle
/
, die (/etc/
zum Beispiel) fast genauso schlecht zu löschen wären . Es ist einfach nicht die Aufgaberm
zu entscheiden, welche Verzeichnisse einfach gelöscht werden können oder nicht.Antworten:
rm
ist ein einfaches Systemwerkzeug. Diese Tools sind so einfach wie möglich aufgebaut, da sie auf jedem System vorhanden sein müssen.rm
Es wird ein bekanntes Verhalten erwartet, insbesondere im Hinblick auf Bestätigungsaufforderungen, damit es in Skripten verwendet werden kann.Das Hinzufügen eines Sonderfalls zur Eingabeaufforderung ist
rm /*
nicht möglich, da der Befehl rm ihn in dieser Form nicht sieht. Der*
Platzhalter wird von der Shell vor der Übergabe erweitertrm
, sodass der eigentliche Befehl, für den ein Sonderfall erforderlich ist, etwa so lautetrm /bin /boot /dev /etc /home /initrd.img /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var /vmlinuz
. Das Hinzufügen des Codes zur Überprüfung dieses Falls (der wahrscheinlich unter verschiedenen Linux-Betriebssystemen unterschiedlich sein wird) wäre eine komplexe Herausforderung und auch anfällig für subtile Fehler. Das Standard-Linuxrm
hat einen Standardschutz gegen Systemzerstörung, indem es sich weigert, es/
ohne die--no-preserve-root
Option zu entfernen .Standardmäßig gibt es drei Schutzmechanismen gegen das Löschen Ihres Systems auf diese Weise:
So entfernen Sie den gesamten Inhalt eines Ordners, anstatt ausgeführt wird
rm /path/to/folder/*
, nichtrm -rf /path/to/folder
, dann ,mkdir /path/to/folder
da dies der Auslöser--preserve-root
Schutz sowie Entfernen aller dotfiles im Ordnerquelle
/
Verknüpfungen zu tatsächlichen Verzeichnissen und Dateien handelt, erfordert viele Kombinationen und Überlegungen. Und wenn man auf die Idee der Standards zurückgreift und solche Überprüfungen hinzufügt, würde dies das konsistente Verhaltensafe-rm
handelt es sich um einen Wrapperrm
: Auf diese Weise kann jedes einzelne Argument (anstelle der gesamten zufälligen Befehlszeile) überprüft werden, ob es nicht auf der konfigurierbaren Blacklist steht, und erst dannrm
mit den überprüften Argumenten aufgerufen werden . Das ist weder sehr komplex noch fehleranfällig.Treffen Sie
safe-rm
den "Wrapper um denrm
Befehl, um versehentliches Löschen zu verhindern":Wenn der obige Installationslink für Sie nicht funktioniert, verwenden Sie
sudo apt install safe-rm
stattdessen einfach . Die Standardkonfiguration enthält bereits die Systemverzeichnisse. Versuchen wirrm /*
zum Beispiel Folgendes :Wie Sie sehen, würde dies verhindern, dass Sie löschen
/home
, wo vermutlich Ihre persönlichen Dateien gespeichert sind. Es hindert Sie jedoch nicht am Löschen~
oder eines seiner Unterverzeichnisse, wenn Sie versuchen, diese direkt zu löschen. Um das~/precious_photos
Verzeichnis hinzuzufügen, fügen Sie einfach den absoluten Pfad mit der insafe-rm
der Konfigurationsdatei aufgelösten Tilde hinzu/etc/safe-rm.conf
, z.Für die Fälle , in denen Sie laufen
rm
ohnesudo
1 und die-f
Flagge ist es eine gute Idee, ein hinzufügenalias
für Shell das machtrm
‚s-i
Flagge der Standard. Auf diese Weiserm
werden Sie vor dem Löschen nach jeder Datei gefragt:Ein ähnlich nützliches Flag ist
-I
nur, dass es "nur einmal vor dem Entfernen von mehr als drei Dateien oder beim rekursiven Entfernen" warnt, was "weniger aufdringlich ist als-i
, aber dennoch Schutz vor den meisten Fehlern bietet":Die allgemeine Gefahr dieser Aliase besteht darin, dass Sie sich leicht daran gewöhnen, sich auf sie zu verlassen, um Sie zu retten. Dies kann bei Verwendung einer anderen Umgebung zu Fehlschlägen führen.
1:
sudo
Ignoriert Aliase , kann man umgehen , dass durch die Definitionalias sudo='sudo '
obwohlquelle
Die Bestätigung ist bereits da, das Problem liegt also
-f
im Befehl--force
; Wenn der Benutzer eine Operation erzwingt, wird angenommen, dass er weiß, was er tut (offensichtlich kann ein Fehler immer hinzugefügt werden).Ein Beispiel:
Bei
--force
Option ist es anders : Ich erhalte keine Bestätigung und Dateien werden gelöscht.Das Problem besteht darin, den Befehl und seine Parameter zu kennen und mehr in
man
einem Befehl zu navigieren (auch wenn der Befehl in einem Lernprogramm enthalten ist). Als ich den Befehl zum ersten Mal sah, fragetar xzf some.tar.gz
ich mich: "Was bedeutetxzf
das? "Dann las ich die Teer-Manpage und entdeckte sie.
quelle
-f
, dass Ordner gelöscht werden müssen. Ich habe sogar eine Sicherheitsabfrage geöffnet, um zu bestätigen und mich zu beschweren-r
. Ich nehme an,rm -rf
dass es zur Norm geworden ist, da es in einem Skript so nützlich ist (Sie möchten nicht, dass das Skript fehlschlägt, nur weil Sie versuchen, nicht vorhandene Dinge zu löschen), sodass Sie es häufig sehen, aber ich nehme an, dass wir es brauchen Seien Sie wachsam,rm -r
wenn Sie in einer Shell nur als "Standard" verwenden (verständlicherweise sollte es keine "Standard" -Annahmen geben, die Sie nicht verstehen, insbesondere bei sudo, aber Menschen werden Menschen sein, und dies ist zumindest sicherer).rm
fordert standardmäßig keine Bestätigung an, sondern fragt nur nach schreibgeschützten Verzeichnissen und Dateien. Wenn Sie diesen Befehl auf Ihrem Computer ausgeführt haben, haben Sie wahrscheinlich viele Ihrer eigenen Dateien gelöscht. Wenn Sierm
nach einer Bestätigung fragen müssen, müssen Sie den-i
Parameter übergeben. Zum Beispiel:rm -ir ./*
Wenn Sie ohne Backups arbeiten, müssen Sie sehr vorsichtig sein, um keine Fehler zu machen. Und hoffe, dass Ihre Hardware nie ausfällt. (Selbst RAID kann Sie nicht vor Dateisystembeschädigungen schützen, die durch fehlerhaften RAM verursacht werden.) Das ist also Ihr erstes Problem. (Ich gehe davon aus, dass Sie dies bereits erkannt haben und in Zukunft Backups durchführen werden.)
Sie können jedoch Folgendes tun, um die Wahrscheinlichkeit von Fehlern zu verringern:
rm='rm -I'
zum Löschen von mehr als drei Dingen auffordert.mv -i
andcp -i
(in vielen normalen Anwendungsfällen wird eine Zieldatei nicht überschrieben).sudo='sudo '
, um eine Alias-Erweiterung für das erste Argument von zu erstellensudo
Ich finde
rm -I
es viel nützlicher alsrm -i
. Während des normalen Gebrauchs werden Sie normalerweise nicht dazu aufgefordert. Wenn Sie also nicht damit gerechnet haben, dass dies nicht der Fall ist, ist dies eine deutlich auffälligere / bessere Warnung. Mit-i
(bevor ich es entdeckte-I
) habe ich mich an das Tippen\rm
gewöhnt, um die Alias-Erweiterung zu deaktivieren, nachdem ich sicher war, dass ich den Befehl richtig eingegeben hatte.Sie möchten sich nicht an die Gewohnheit gewöhnen, sich auf
rm -i
oder-I
Aliase zu verlassen, um Sie zu retten . Es ist Ihre Sicherheitsleine, von der Sie hoffen, dass sie nie benutzt wird. Wenn ich tatsächlich interaktiv auswählen möchte, welche Übereinstimmungen gelöscht werden sollen, oder ich nicht sicher bin, ob mein Glob mit einigen zusätzlichen Dateien übereinstimmt, gebe ich manuell einrm -i .../*whatever*
. (Auch eine gute Angewohnheit für den Fall, dass Sie jemals in einer Umgebung ohne Ihre Aliase sind).Verteidigen Sie sich gegen fettes Fingern, Enterindem Sie
ls -d /*foo*
zuerst tippen und dann den Pfeil nach oben in ändern,rm -r
nachdem Sie mit dem Tippen fertig sind. Daher enthält die Befehlszeilerm -rf ~/
zu keinem Zeitpunkt gefährliche Befehle oder ähnliches. Sie können es nur durch eine Änderung „Arm“ls
zurm
mit Steuer-a, alt-d zu Beginn der Linie zu gehen und das Hinzufügen der-r
oder die ,-f
nachdem Sie haben den Befehl eingegeben~/some/sub/dir/
Teil des Befehls.Führen Sie je nach dem, was Sie löschen, tatsächlich das
ls -d
erste aus oder nicht, wenn dies nichts zu dem beiträgt, was Sie mit der Tabulatorvervollständigung sehen. Sie können mitrm
(ohne-r
oder-rf
) beginnen, es ist also nur control-a / control-right (oder alt + f) / space /-r
.(Gewöhnen Sie sich daran, die leistungsstarken Tastenkombinationen zum Bearbeiten von Zeilen zu drücken, um sich schnell zu bewegen, z. B. Strg-Pfeile oder Alt + F / B, um sich wortweise zu bewegen, und töten Sie ganze Wörter mit Alt + Rücktaste oder Alt + D oder Strg-W. Und Kontrolle -u um an den Anfang der Zeile zu töten. Und control- / um eine Änderung rückgängig zu machen, wenn Sie einen Schritt zu weit gehen. Und natürlich den Pfeil nach oben, den Sie mit control-r / control-s suchen können.)
Vermeiden
-rf
Sie dies, es sei denn, Sie benötigen es tatsächlich , um Eingabeaufforderungen zum Entfernen schreibgeschützter Dateien zu unterdrücken.Nehmen Sie sich etwas Zeit zum Nachdenken, bevor Sie bei einem
sudo
Befehl die Eingabetaste drücken . Vor allem, wenn Sie keine vollständigen Backups haben oder jetzt einen schlechten Zeitpunkt haben, um diese wiederherzustellen.quelle
Nun, die kurze Antwort ist, einen solchen Befehl nicht auszuführen.
Die lange Geschichte ist, dass es Teil der Anpassung ist. Hier spielen im Wesentlichen zwei Faktoren eine Rolle. Zum einen können Sie alle Dateien ändern.
Das zweite ist, dass der Befehl rm den hilfreichen syntaktischen Zucker zum Löschen aller Dateien in einem Ordner bietet.
Tatsächlich könnte dies als eine einfache Lehre von Unix-Maschinen wiedergegeben werden. Alles ist eine Datei . Um die Sache besser zu machen, gibt es Zugriffskontrollen, die jedoch von Ihrer Verwendung von überschrieben werden
Ich vermute, Sie könnten einen Alias oder eine Funktion hinzufügen, um sicherzustellen, dass dies niemals ausgeführt werden kann.
quelle
Wenn die Auslastung Ihres Systemdateibereichs nicht immens ist (und heutzutage bedeutet "immens" "Hunderte von Gigabyte oder mehr"), erstellen Sie einige Instanzen virtueller Maschinen und arbeiten Sie immer in einer. Für die Wiederherstellung wird lediglich eine Sicherungsinstanz verwendet.
Oder Sie könnten ein Chroot-Gefängnis erstellen und darin arbeiten. Sie würden immer noch eine Wiederherstellung benötigen, wenn es in den Papierkorb geworfen würde, aber das wäre einfacher, wenn Sie ein laufendes (umschließendes) System verwenden.
quelle
rm
durchsafe-rm
..project_root
oder, wenn das Dateisystem dies unterstützt, ein Attribut im Verzeichnis selbst. Dann suchte das Skript im Dateibaum nach dem Projektstamm und beschwerte sich, dass sich das aktuelle Verzeichnis nicht in einem Projekt befand. Wenn sich die Projekte alle an derselben Stelle befinden, müssen Sie im Skript möglicherweise ein Projekt benennen. Sie könnten immer noch das falsche Projekt löschen, aber nicht das gesamte System zerstören.chroot
wäre, so etwas wie Docker zu benutzen (was ich glaube eigentlichchroot
unter der Decke verwendet). Hängen Sie für andere Dateien, die Sie nur lesen müssen, ein schreibgeschütztes Dateisystem ein.rm
ist ein sehr alter Unix-Befehl und wurde wahrscheinlich nicht im Hinblick auf Benutzerfreundlichkeit entwickelt. Es versucht genau das zu tun, wonach es verlangt, wenn es die Berechtigungen hat. Ein Nachteil für viele neue Benutzer ist, dass sie häufig Code sehensudo
und nicht viel darüber nachdenken, ihn zu verwenden. Funktionen , die direkt auf Dateien wie ändernrm
,dd
,chroot
etc. erfordern äußerste Sorgfalt im Einsatz.Heutzutage verwende ich gerne
trash
(ohne sudo) von trash-cli . Es funktioniert wie der Papierkorb von Windows, indem Sie leicht versehentlich gelöschte Dateien abrufen können. In Ubuntu sind bereits ein Papierkorbordner und eine Funktion zum Verschieben in den Papierkorb in Files integriert.Auch dann können Sie Fehler machen. Sichern Sie daher unbedingt Ihr gesamtes Dateisystem.
quelle