Warum kann das gesamte Dateisystem gelöscht werden?

24

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.

Mister_Fix
quelle
20
"Warum ist das überhaupt möglich?" Warum sollte es nicht möglich sein? Es gibt durchaus gute Gründe, den Inhalt einer Verzeichnishierarchie zu löschen, und es gibt viele Teilmengen /, die ( /etc/zum Beispiel) fast genauso schlecht zu löschen wären . Es ist einfach nicht die Aufgabe rmzu entscheiden, welche Verzeichnisse einfach gelöscht werden können oder nicht.
Chepner
2
Titel sagt "Warum ist es möglich, das System zu löschen?" Die Frage selbst lautet "Meine Frage lautet: Warum nicht eine Bestätigung implementieren, wenn der Benutzer versucht, sein Dateisystem zu löschen?". Das macht die Frage also unklar. Welche ist Ihre eigentliche Frage, damit wir zumindest wissen, was zu beantworten ist? Bitte bearbeiten Sie Ihren Beitrag zur Klärung
Sergiy Kolodyazhnyy
3
Was ist eigentlich die Frage hier? Ich kann drei sehen: (1) Warum ist es möglich? (2) Wie kann dies verhindert werden? Und (3) Warum wird keine Bestätigung implementiert? - Sie sind nicht die gleiche Frage, die erste fragt nach Argumenten, die zweite nach Werkzeugen. (Der dritte ist mit dem zweiten verwandt, aber immer noch nicht wirklich gleich. Eine Bestätigung ist nicht der einzige Weg, um etwas zu verhindern.)
ilkkachu
10
Wenn Sie den Autor der Frage nicht um Klärung bitten, kommentieren Sie sie bitte überhaupt nicht . Ich sehe hier viele selbstglückwunschende Kommentare, die erklären, warum das die Schuld des OP ist, nicht zu wissen, was die Flags bedeuten, oder kein Backup zu haben oder was auch immer. Ich bin sehr froh zu wissen, dass so viele unserer Benutzer klug genug sind, Backups zu erstellen und keine Befehle auszuführen, die sie nicht verstehen. Das ist absolut großartig für sie, aber im Grunde genommen nicht hilfreich für das OP, das diese Lektion vermutlich inzwischen auch gelernt hat. Lasst uns also aufhören, uns in unserer eigenen Brillanz zu sonnen und einfach die Frage beantworten.
Terdon

Antworten:

16

rmist ein einfaches Systemwerkzeug. Diese Tools sind so einfach wie möglich aufgebaut, da sie auf jedem System vorhanden sein müssen. rmEs 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 erweitert rm, sodass der eigentliche Befehl, für den ein Sonderfall erforderlich ist, etwa so lautet rm /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-Linux rmhat einen Standardschutz gegen Systemzerstörung, indem es sich weigert, es /ohne die --no-preserve-rootOption zu entfernen .

Standardmäßig gibt es drei Schutzmechanismen gegen das Löschen Ihres Systems auf diese Weise:

  1. Berechtigungen - Normale Benutzer können wichtige Dateien nicht entfernen. Sie haben dies mit sudo umgangen
  2. Verzeichnisse - Standardmäßig entfernt rm keine Verzeichnisse. Sie haben dies mit der Option -r umgangen
  3. Schreibgeschützte Dateien - Standardmäßig bittet rm vor dem Löschen einer schreibgeschützten Datei um Bestätigung (dies hätte nicht den gesamten Schaden gestoppt, aber möglicherweise eine Eingabeaufforderung ausgegeben, bevor das System nicht wiederherstellbar war). Sie haben diesen Schutz mit dem Flag -f umgangen

So entfernen Sie den gesamten Inhalt eines Ordners, anstatt ausgeführt wird rm /path/to/folder/*, nicht rm -rf /path/to/folder, dann , mkdir /path/to/folderda dies der Auslöser --preserve-rootSchutz sowie Entfernen aller dotfiles im Ordner

rhellen
quelle
3
"Es wird erwartet, dass rm ein bekanntes Verhalten aufweist" und es ist tatsächlich eines der vom POSIX-Standard spezifizierten Tools. "Der Platzhalter * wird von der Shell erweitert, bevor er an rm übergeben wird." Genau das Hinzufügen von Überprüfungen für alle Arten von Parametern, bei denen es sich möglicherweise um symbolische /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 Verhalten
stören
Genau deshalb safe-rmhandelt es sich um einen Wrapper rm: 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 dann rmmit den überprüften Argumenten aufgerufen werden . Das ist weder sehr komplex noch fehleranfällig.
Dessert
59

Treffen Sie safe-rmInstallieren Sie safe-rmden "Wrapper um den rmBefehl, um versehentliches Löschen zu verhindern":

safe-rm verhindert das versehentliche Löschen wichtiger Dateien, indem es rmdurch einen Wrapper ersetzt, 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. ( man safe-rm)

Wenn der obige Installationslink für Sie nicht funktioniert, verwenden Sie sudo apt install safe-rmstattdessen einfach . Die Standardkonfiguration enthält bereits die Systemverzeichnisse. Versuchen wir rm /*zum Beispiel Folgendes :

$ rm /*
safe-rm: skipping /bin
safe-rm: skipping /boot
safe-rm: skipping /dev
safe-rm: skipping /etc
safe-rm: skipping /home
safe-rm: skipping /lib
safe-rm: skipping /proc
safe-rm: skipping /root
safe-rm: skipping /sbin
safe-rm: skipping /sys
safe-rm: skipping /usr
safe-rm: skipping /var
…

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_photosVerzeichnis hinzuzufügen, fügen Sie einfach den absoluten Pfad mit der in safe-rmder Konfigurationsdatei aufgelösten Tilde hinzu /etc/safe-rm.conf, z.

echo /home/dessert/precious_photos | sudo tee -a /etc/safe-rm.conf

Für die Fälle , in denen Sie laufen rmohne sudo1 und die -fFlagge ist es eine gute Idee, ein hinzufügenalias für Shell das macht rm‚s -iFlagge der Standard. Auf diese Weise rmwerden Sie vor dem Löschen nach jeder Datei gefragt:

alias rm='rm -i'

Ein ähnlich nützliches Flag ist -Inur, 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":

alias rm='rm -I'

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: sudoIgnoriert Aliase , kann man umgehen , dass durch die Definition alias sudo='sudo 'obwohl

Dessert
quelle
25

Die Bestätigung ist bereits da, das Problem liegt also -fim 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:

 rm -r ./*
 rm: remove write-protected regular file './mozilla_mvaschetto0/WEBMASTER-04.DOC'? N
 rm: cannot remove './mozilla_mvaschetto0': Directory not empty
 rm: descend into write-protected directory './pulse-PKdhtXMmr18n'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-bolt.service-rZWMCb'? n
 rm: descend into write-protected directory './systemd-private-     890f5b31987b4910a579d1c49930a591-colord.service-4ZBnUf'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-fwupd.service-vAxdbk'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-minissdpd.service-9G8GrR'? 
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-ModemManager.service-s43zUX'? nn
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-rtkit-daemon.service-cfMePv'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-systemd-timesyncd.service-oXT4pr'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-upower.service-L0k9rT'? n

Bei --forceOption 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 maneinem Befehl zu navigieren (auch wenn der Befehl in einem Lernprogramm enthalten ist). Als ich den Befehl zum ersten Mal sah, frage tar xzf some.tar.gzich mich: "Was bedeutet xzfdas? "

Dann las ich die Teer-Manpage und entdeckte sie.

AtomiX84
quelle
Ich denke nicht, dass das hier relevant ist. An dem Punkt, an dem rm zuerst nach einer schreibgeschützten oder einer beliebigen Datei fragt, hat es möglicherweise bereits eine ganze Reihe wichtiger Dateien gelöscht.
Jonas Schäfer
1
Also persönlich habe ich immer gedacht -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 -rfdass 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 -rwenn 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).
Captain Man
2
Rmdir ist der sicherste Weg, um einen Ordner zu löschen
AtomiX84
rmfordert 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 Sie rmnach einer Bestätigung fragen müssen, müssen Sie den -iParameter übergeben. Zum Beispiel:rm -ir ./*
Dan
8

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:

  • Alias, der rm='rm -I'zum Löschen von mehr als drei Dingen auffordert.
  • alias mv und cp to mv -iand cp -i(in vielen normalen Anwendungsfällen wird eine Zieldatei nicht überschrieben).
  • Alias sudo='sudo ', um eine Alias-Erweiterung für das erste Argument von zu erstellensudo

Ich finde rm -Ies viel nützlicher als rm -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 \rmgewö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 -ioder -IAliase 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 ein rm -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 -rnachdem Sie mit dem Tippen fertig sind. Daher enthält die Befehlszeile rm -rf ~/zu keinem Zeitpunkt gefährliche Befehle oder ähnliches. Sie können es nur durch eine Änderung „Arm“ lszu rmmit Steuer-a, alt-d zu Beginn der Linie zu gehen und das Hinzufügen der -roder die , -fnachdem 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 -derste aus oder nicht, wenn dies nichts zu dem beiträgt, was Sie mit der Tabulatorvervollständigung sehen. Sie können mit rm(ohne -roder -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 -rfSie 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 sudoBefehl die Eingabetaste drücken . Vor allem, wenn Sie keine vollständigen Backups haben oder jetzt einen schlechten Zeitpunkt haben, um diese wiederherzustellen.

Peter Cordes
quelle
6

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

sudo

Ich vermute, Sie könnten einen Alias ​​oder eine Funktion hinzufügen, um sicherzustellen, dass dies niemals ausgeführt werden kann.

HaoZeke
quelle
4

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.

Loren Rosen
quelle
Dies ist wahrscheinlich die effektivste Antwort, da sie auch Skripte von Drittanbietern vor Beschädigungen schützen kann. Sie müssen sich nur um die tatsächliche Malware kümmern.
PyRulez
Ich dachte an einen anderen Winkel. Es lohnt sich zu fragen, warum Sie zuerst rekursive Löschvorgänge durchführen müssen. Vielleicht werden wirklich einige Skripte zum Entfernen eines Projekts usw. benötigt
Loren Rosen,
"Es lohnt sich zu fragen, warum Sie zuerst rekursive Löschungen durchführen müssen." Nur weil es keinen eingebauten Befehl gibt, heißt das noch lange nicht, dass Sie keinen Fehler machen können. Skripte von Drittanbietern löschen möglicherweise Dateien nacheinander aus einem Verzeichnis. Es gibt auch andere Möglichkeiten, das System zu beschädigen, wenn nur eine Datei berührt wird. Zumindest hilft jedoch das Ersetzen rmdurch safe-rm.
PyRulez
Meine Vorstellung mit dem Skript war, dass es eine eingebaute Vorstellung von einem "Projekt" oder ähnlichem haben würde. Möglicherweise haben Sie eine leere Datei im Projektstamm .project_rootoder, 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.
Loren Rosen,
... auch eine Variante chrootwäre, so etwas wie Docker zu benutzen (was ich glaube eigentlich chrootunter der Decke verwendet). Hängen Sie für andere Dateien, die Sie nur lesen müssen, ein schreibgeschütztes Dateisystem ein.
Loren Rosen
3

rmist 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 sehen sudound nicht viel darüber nachdenken, ihn zu verwenden. Funktionen , die direkt auf Dateien wie ändern rm, dd, chrootetc. 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.

qwr
quelle