Wie weit kommst du mit einem 'rm -rf /' Befehl?

200

Ich habe mich oft gefragt, wie weit das System tatsächlich kommen wird, wenn Sie ausgeführt werden rm -rf /. Ich bezweifle, dass das Betriebssystem sich selbst löschen kann (?)

Bonus Frage : Nachdem der Befehl ausgeführt wurde, wird rmsich entfernt haben?

Update: Ich habe dies in einigen der wichtigsten Unix-Distributionen mit VirtualBox getestet und die Antworten beschreiben genau, was passiert. Wenn die richtigen Parameter angegeben wurden, entfernt rm alle physischen Daten auf der Disc. Ich bin jedoch auf einige Probleme gestoßen, wenn ich eine andere Version von rm als GNU verwendet habe. Ich glaube zum Beispiel, dass BusyBox eine eigene Version hat und Sie nicht so viel entfernen können, wie Sie möglicherweise könnten.

Diese Frage war eine Super User Frage der Woche .
Lesen Sie den Blog-Eintrag vom 7. Juli 2011, um weitere Informationen zu erhalten, oder reichen Sie Ihre eigene Frage der Woche ein.

n0pe
quelle
8
Es ist lustig, dass Sie diese Frage gestellt haben. Ich beantwortete gerade eine andere Frage in einem anderen Forum und erinnerte mich an einen Artikel, den ich vor einiger Zeit gelesen hatte. Zum Glück habe ich es für Zeiten wie diese gespeichert: DIE klassische Unix-Horrorgeschichte Abgesehen von der Tatsache, dass es interessant ist zu sehen, wie weit es gehen wird ... Ich denke, es ist ein sehr gut geschriebener Artikel und eine allgemein gute Lektüre!
Akseli
3
Ich habe gerade sudo rm -rf /tinycore / microcore Linux ausprobiert und es scheint, dass das Betriebssystem mehrere Verzeichnisse (/ sys und andere) vor dem Löschen schützt.
Nr.
47
Ich habe es rm -f /bin/rmeinmal versucht . Leider hat es funktioniert und ich habe die nächste Stunde damit verbracht, die richtige Version von rmback von GNU coreutils zu bekommen.
Squircle
17
Warten Sie eine Sekunde, ich werde versuchen ...
Martijn Courteaux
38
Ich mache das die ganze Zeit im Apple Store
eggie5 21.07.11

Antworten:

188

Wenn Sie rmGNU-Coreutils haben (höchstwahrscheinlich eine reguläre Linux-Distribution), rm -rf /wird dies vom eingebauten Schutz abgelehnt (laut Manpage und Wikipedia haben Sie das nicht versucht).

Sie können diesen Schutz mit überschreiben --no-preserve-root. rmwird dann alles entfernen, was es kann, ohne anzuhalten, nachdem versucht wurde, jede einzelne Datei zu entfernen. Natürlich werden virtuelle Dateisysteme wie /procund nicht entfernt /sys, aber das ist irrelevant - es wird alles auf Ihrer Festplatte entfernen.

Nach Beendigung des Befehls wird die Festplatte einschließlich des Betriebssystems gelöscht. Der Kernel und die aktuellen Prozesse werden weiterhin aus dem Speicher ausgeführt, aber viele Prozesse sterben ab, weil sie nicht auf eine Datei zugreifen können. Das Betriebssystem kann beim nächsten Mal nicht mehr gestartet werden.

Ambroz Bizjak
quelle
67
Genau das, wonach ich gesucht habe. Nun, um diese Kraft zu nutzen, um die Welt zu erobern.
Nr.
34
+1 vor allem, --no-preserve-rootweil das normalerweise nicht erwähnt wird.
Matěj G.
22
@ MaxMackie, es ist erwähnenswert, dass Hacker dies sehr schnell als die am wenigsten nützliche Sache empfanden, die sie einem Benutzer antun konnten. Es zerstört alle Daten, die für Geldgewinne verwendet werden könnten, und verhindert, dass der Hacker die Maschine weiter ausnutzt. Wie eine Katze mit einem Insekt wollen Sie es nicht töten, sondern nur eine Weile damit spielen, weil es Spaß macht.
zzzzBov
5
Um die andere Frage des OP zu beantworten, wird sich rm von selbst entfernen. Es ist durchaus möglich, eine ausführbare Datei zu ändern oder zu löschen, auch wenn eine Instanz davon ausgeführt wird. Es läuft auch weiter und bleibt von der Änderung unberührt.
Thomasrutter
3
Ich möchte "chmod -R user: user *" bei / erwähnen, da es sich auch um einen rekursiven und kostspieligen Fehler handelt. Ich habe es einmal gemacht und war auf halbem Weg nach Hause, als ich abbrechen konnte. / bin / boot / etc / dev gehörten. Glücklicherweise lief der Server weiter, während ich die nächsten Stunden manuell verbrachte und die Eigentumsrechte von einem Referenzsystem zurücksetzte. Niemand sonst konnte danach su oder sudo verwenden. Schließlich wurde festgestellt, dass in / bin / su das setuid-Bit nicht mehr gesetzt war. Beachten Sie für die Zukunft: chowning / bin / su setzt das gesetzte Bit zurück!
Andy Lee Robinson
42

Für diejenigen, die solche Dinge gerne visuell tun, während sie Technomusik hören.

Rm-rf unter Linux ausführen (Video)

Bonuspunkte, wenn Sie die Prozesse beim Sterben benennen können.

Xeoncross
quelle
22

Richten Sie eine VM ein und versuchen Sie es zum Spaß?

Es wird ziemlich weit gehen ... wenn du ein GUI verwendest, könntest du Spaß daran haben, Dinge zu bemerken, die sichtbarer werden. (Symbole in den Menüs werden nicht mehr geladen usw.)

Wenn Sie es loslassen, ist das Betriebssystem so gut wie nicht mehr wiederherstellbar, obwohl Sie möglicherweise einige Daten problemlos zurückerhalten können.

In beiden Fällen möchten Sie das Betriebssystem neu installieren.

PriceChild
quelle
7
Ich habe nicht einmal daran gedacht, es in einer VM zu versuchen. Ich werde es jetzt versuchen! ooo das macht spaß
Nr.
40
Schreibt versehentlich den Befehl an das Terminal des Hostsystems
slhck
1
Schauen Sie sich den Artikel an, den ich gepostet habe. "Die klassische Unix-Horrorgeschichte!"
Akseli
1
Ich bin gerade auf der Arbeit und habe keine Zeit, eine vollständige Installation einer beliebten Distribution (Ubuntu / Slack / Suse / Fedora) durchzuarbeiten. Wenn jemand anderes eine VM-Festplattendatei klonen und für uns testen kann, wäre das fantastisch.
Nr.
2
Mit Amazon EC2 sollte es schnell gehen, einen der bereits installierten AMIs zu starten und loszulegen ...
David d C e Freitas
11

Wenn Sie es auf http://bellard.org/jslinux/ ausprobieren, erhalten Sie :

rm: kann '/ dev / pts' nicht entfernen: Gerät oder Ressource belegt
rm: kann '/ dev' nicht entfernen: Verzeichnis nicht leer
rm: kann '/ proc / swaps' nicht entfernen: Operation nicht erlaubt
rm: kann 't remove' / proc / kallsyms ': Operation nicht erlaubt
rm: kann' / proc / dma 'nicht entfernen: Operation nicht erlaubt

SNIP 881-Einträge

rm: kann '/ proc / 149 / oom_adj'
nicht entfernen : Berechtigung verweigert rm: kann '/ proc / 149' nicht entfernen: Operation nicht erlaubt
rm: kann '/ proc' nicht entfernen: Gerät oder Ressource belegt
rm: kann '/ tmp' nicht entfernen: Gerät oder Ressource belegt
rm: kann '/' nicht entfernen: Gerät oder Ressource belegt

Hallo71
quelle
1
Ja, ich bekomme auch diese Fehler / Warnungen. Denken Sie, dass dieser Standard?
Nr.
5
/ proc, / sys, manchmal / dev und alle Mountpunkte sind Eigenschaften des Betriebssystems und können nicht gelöscht werden.
pjc50
1
Bei @ pcj50 handelt es sich nicht um Dateien auf der Festplatte, daher ist das "Löschen" dieser Dateien nicht sinnvoll.
CarlF
7

Ich erinnere mich, dass dies in früheren alt.sysadmin.recoveryZeiten, als es noch keine gab, immer wieder aufgegriffen wurde /procund /deves sich nur um ein reguläres Verzeichnis mit Einträgen für eine Reihe ungewöhnlicher Inodes handelte ...

... aber bei einigen Unix-Varianten (ich erinnere mich an HP-UX, aber das könnte völlig falsch sein) konnte der letzte Verzeichniseintrag für ein ausgeführtes Programm nicht entfernt werden. (Shared Libraries? Was sind das?)

Auf solchen Systemen , wenn Sie begann eine bis in den Wartungsmodus (so wurde nichts läuft , aber die Shell, auch nicht init, und keine sekundären Dateisysteme wurden montiert) und haben exec /bin/rm -rf /, würden Sie mit einem völlig leeren Root - Dateisystem belassen werden , außer dass /binund /bin/rmwürde überleben.

Die Bewohner des gruseligen Teufelsklosters hielten dies für angemessen und angemessen.

zwol
quelle
4

rm -rf / sollte bei neueren Implementierungen nicht zugelassen werden, da vorgeschlagen wurde, dass sie den POSIX-Standard verletzen:

" rm -rf /" Schutz auf Oracle Blog

Letztendlich haben wir die Spezifikation geändert und Solaris 10 hat (seit Build 36) eine Version von / usr / bin / rm (/ bin ist ein Sym-Link zu / usr / bin unter Solaris) und / usr / xpg4 / bin / rm was sich so verhält:

[28] /bin/rm -rf /
rm of / is not allowed
[29] 
jlliagre
quelle
2
"darauf hinweisen, dass, wenn man versucht," / "rekursiv zu entfernen, man letztendlich versucht," .. "und". "zu entfernen, und dass alles, was wir tun, es rm erlaubt, dies heuristisch vorab zu bestimmen. Erstaunlicherweise haben sie das gekauft ! "- äh, würde das nicht das Entfernen eines Verzeichnisses verbieten ? Die eigentliche Spezifikation verbietet nur .. und. In den eigentlichen Befehlszeilenargumenten steht nichts darüber, was Sie "letztendlich versuchen zu entfernen"
Random832
1
Warum sollte es nicht erlaubt sein, ein Verzeichnis zu entfernen? Das Wurzelverzeichnis ist das einzige, das hier betroffen ist, und das Entfernen impliziert offensichtlich das Entfernen von "." und "..", unabhängig vom aktuellen Verzeichnis. Der gesunde Menschenverstand ist in der Standardinterpretation nicht verboten.
jlliagre
1
Diese Argumentation ist ein reines Genie.
Nate CK
Der Standard gibt an, dass rm nicht fortgesetzt werden darf, wenn ein Argument die Zeichenfolge "." oder ".." als Basisname-Komponente. Sie können nicht entfernen, /foo/..auch wenn Sie nicht in sind /foo. Es gibt nicht an , dass Sie das aktuelle Verzeichnis (z. B. rm -r `pwd`) oder das übergeordnete Verzeichnis des aktuellen Verzeichnisses nicht entfernen dürfen .
Random832
2
In der Tat habe ich die Aussage falsch verstanden und Sie haben Recht. Hoffentlich akzeptierten die Standard-Leute das intelligentere Verhalten als standardkonform. Das Entfernen großer Teile, wenn nicht das gesamte Dateisystem vorhanden ist, würde das Betriebssystem ohnehin nicht standardkonform machen.
jlliagre
3

Ein Punkt, den ich von keinem anderen gesehen habe: Dateien, die gerade geöffnet sind (z. B. rm selbst), verschwinden, selbst wenn sie gelöscht werden, erst nach dem Schließen vom Laufwerk.

CarlF
quelle
Das ist richtig, weil sie in den Speicher geladen sind, oder?
Nr.
Ich bin mir nicht sicher, ob das sicher ist. Der Kernel könnte die entfernte Datei sehr gut einfach in den Speicher laden und sofort von der Festplatte entfernen und diese Kopie im Speicher behalten, bis die Datei geöffnet ist (z. B. bis rm ausgeführt wird).
Ambroz Bizjak
Ich spekuliere nicht. Wenn ein Programm ausgeführt wird, wird es durch das Löschen zumindest auf meinen Linux-Boxen nicht entfernt. (Allerdings habe ich das in ein paar Jahren noch nicht getestet.)
CarlF
4
rm wird sich aus dem fs entfernen - das programm ist vollständig im speicher geladen, nicht die datei
warren
4
@MaxMackie: Nicht, weil sie im Speicher geladen sind, sondern weil eine geöffnete Dateireferenz die gleiche Leistung wie eine feste Verknüpfung hat (dh wenn eine Datei mindestens eine feste Verknüpfung hat, wird sie nicht von der Festplatte gelöscht).
Lie Ryan
1

Wenn Sie es einmal probiert haben (auf einem Server, der mich nervt), als root im Terminal angemeldet, verlieren Sie fast alles. Das einzige, was nicht gelöscht wird, ist nur der Prozess, der für das Betriebssystem wesentlich war.

Anarko_Bizounours
quelle
12
"[nicht gelöscht] nur der Prozess, der für das Betriebssystem wesentlich war" - oh, keine Sorge. Im Gegensatz zu Windows löscht Linux problemlos alles, auch wenn die Datei betriebssystemkritisch ist und verwendet wird. /boot, /sbin, /etc, /bin, /vmlinuz? Bam, weg. Viel Glück beim Booten ohne diese - in der Tat viel Glück, wenn alles erledigt ist.
Piskvor
Wenn ich mich erinnere, gab es eine Datei, die nicht gelöscht wurde, und ich ließ mein Linux länger als 4 Stunden laufen. Trotzdem ist es gut zu wissen, was passiert, wie ein chmod 777 / * -fR zu machen;)
Anarko_Bizounours
3
"chmod 777 / * -fR" - Das sollte das System nur sehr unsicher, wenn auch sehr benutzerfreundlich machen.
Bart van Heukelom
1
@BartvanHeukelom, einige Tools führen einen schnellen Selbsttest durch oder werden vom System auf ordnungsgemäße Eigentümerschaft und Berechtigungen geprüft und lehnen es ab, zu handeln, wenn sie falsch konfiguriert sind.
Killermist
1
chmod -fR 777 /ist schädlich, weil es die Bits setuid und setgid ausschaltet.
G-Man,
1

Wie weit Sie kommen, hängt im Wesentlichen von den spezifischen Unix / Linux-Distributionen ab.

Um Ihre Basisfrage zu beantworten, wird yes - rmcommand zusammen mit allen anderen Standardbefehlen in /binund anderen Ordnern entfernt.

Hier ist der einfache Test, den ich unter Linux Ubuntu 15.04 mit VM durchgeführt habe.

  1. Virtuelle Maschine initialisieren über vagrant:

    vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh
    
  2. Wenn Sie dann versuchen, alle Dateien auf die übliche Weise zu entfernen, können Sie nicht:

    vagrant@vagrant-ubuntu-vivid-64:~$ sudo rm -fr /
    rm: it is dangerous to operate recursively on '/'
    rm: use --no-preserve-root to override this failsafe
    
  3. Also lass es uns versuchen --no-preserve-root. Überprüfen Sie immer, ob Sie in der virtuellen Maschine angemeldet sind (so wie Sie es haben vagrant@vagrant-ubuntu-vivid-64:~$), und führen Sie es dann aus (versuchen Sie es nicht zu Hause):

    vagrant@vagrant-ubuntu-vivid-64:~$ sudo rm -vfr --no-preserve-root /
    removed directory: '/lost+found'
    removed directory: '/opt'
    removed '/bin/nc'
    removed '/bin/less'
    removed '/bin/wdctl'
    removed '/bin/nano'
    ...
    removed '/bin/rmdir'
    removed '/bin/sh'
    removed '/bin/rm'
    ...
    removed directory: '/bin'
    removed directory: '/usr/games'
    removed '/usr/bin/byobu-launcher-install'
    removed '/usr/bin/ipcmk'
    removed '/usr/bin/sum'
    removed directory: '/usr/bin'
    removed '/usr/lib/gcc/x86_64-linux-gnu/4.9.2'
    removed '/usr/lib/gcc/x86_64-linux-gnu/5.0.1'
    removed directory: '/usr/lib/gcc/x86_64-linux-gnu/5'
    removed '/usr/lib/gcc/x86_64-linux-gnu/4.9/libquadmath.so'
    removed '/usr/lib/gcc/x86_64-linux-gnu/4.9/libgomp.so'
    ...
    removed directory: '/run/initramfs'
    removed directory: '/media'
    rm: cannot remove '/proc/fb': Operation not permitted
    rm: cannot remove '/proc/fs/ext4/sda1/options': Operation not permitted
    ...
    removed '/vmlinuz'
    removed '/boot/config-3.19.0-23-generic'
    removed '/boot/grub/grubenv'
    ...
    removed directory: '/boot'
    removed '/lib64/ld-linux-x86-64.so.2'
    rm: cannot remove '/dev/hugepages': Device or resource busy
    rm: cannot remove '/dev/mqueue': Device or resource busy
    rm: cannot remove '/dev/shm': Device or resource busy
    removed '/dev/vcsa7'
    ...
    removed '/dev/mem'
    removed '/dev/rfkill'
    removed '/dev/vga_arbiter'
    ...
    rm: cannot remove '/sys/fs/ecryptfs/version': Operation not permitted
    removed directory: '/etc'
    removed directory: '/mnt'
    removed '/vagrant/.vagrant/machines/default/virtualbox/action_provision'
    removed '/vagrant/.vagrant/machines/default/virtualbox/action_set_name'
    removed '/vagrant/.vagrant/machines/default/virtualbox/creator_uid'
    removed '/vagrant/.vagrant/machines/default/virtualbox/id'
    removed '/vagrant/.vagrant/machines/default/virtualbox/index_uuid'
    removed '/vagrant/.vagrant/machines/default/virtualbox/private_key'
    removed '/vagrant/.vagrant/machines/default/virtualbox/synced_folders'
    removed directory: '/vagrant/.vagrant/machines/default/virtualbox'
    removed directory: '/vagrant/.vagrant/machines/default'
    removed directory: '/vagrant/.vagrant/machines'
    removed directory: '/vagrant/.vagrant'
    removed '/vagrant/Vagrantfile'
    rm: cannot remove '/vagrant': Device or resource busy
    

    Danach kehrt es zur Shell-Eingabeaufforderung zurück, als wäre nichts passiert, aber Sie können keine Befehle mehr ausführen, abgesehen von wenigen eingebauten und kill, sodass Sie Ihren Job beenden und Ihre Sitzung beenden können :)

    Zum Beispiel:

    $ rm
    rm: command not found
    $ kill
    kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
    $ which kill
    -bash: /usr/bin/which: No such file or directory
    $ kill -9 $$
    Connection to 127.0.0.1 closed.
    

Also hat es ziemlich alles entfernt, einschließlich rm, lsund alle anderen Befehle, aber du bist immer noch angemeldet. Es gibt einige spezielle Ordner, die nicht entfernt wurden, wie z. B. Geräte /dev, /procoder /sysdie keine regulären Verzeichnisse / Dateien sind, aber es ist ein Pseudodateisystem, das Schnittstellen für die Verarbeitung und den Kernel von Daten bietet.

Wenn Sie nicht über Vagrant oder Linux verfügen, können Sie mit einigen JavaScript Linux x86-Emulatoren spielen .

Wenn Sie an Möglichkeiten zur Wiederherstellung nach einer solchen Katastrophe interessiert sind, überprüfen Sie Folgendes:

Kenorb
quelle