Quanto lontano arriverai con un comando 'rm -rf /'?


200

Mi sono spesso chiesto fino a che punto il sistema raggiungerà effettivamente se corri rm -rf /. Dubito che il sistema operativo sarebbe in grado di cancellare se stesso (?)

Domanda bonus : dopo che il comando è stato eseguito, si sarà rmrimosso da solo?

Aggiornamento: ho provato questo in un paio delle principali distribuzioni unix usando VirtualBox e le risposte descrivono esattamente cosa succede. Se vengono forniti i parametri corretti, rm rimuoverà ogni bit fisico di dati sul disco. Tuttavia, ho riscontrato alcuni problemi durante l'utilizzo di una versione di rm diversa da quella GNU. Ad esempio, credo che BusyBox abbia la propria versione e non ti consente di rimuovere il più possibile.

Questa domanda era una domanda super utente della settimana .
Leggi il post del blog del 7 luglio 2011 per maggiori dettagli o invia la tua domanda della settimana.


8
È divertente che tu abbia posto questa domanda. Stavo solo rispondendo a un'altra domanda rm -f su un altro forum e ho iniziato a ricordare un articolo che ho letto qualche tempo fa. Fortunatamente l'ho salvato per momenti come questo: LA classica storia horror di Unix Oltre al fatto che è interessante vedere fino a che punto andrà ... Penso che sia un articolo molto ben scritto ed è generalmente una buona lettura!
akseli,

3
Ho appena provato sudo rm -rf /su tinycore / microcore linux e sembra che il sistema operativo protegga diverse directory (/ sys e altre) dall'eliminazione.
n0pe

47
Ci ho provato rm -f /bin/rmuna volta. Sfortunatamente, ha funzionato, e ho trascorso l'ora successiva a ottenere la versione giusta di rmback da GNU coreutils.
fai il giro del

17
Aspetta un secondo, proverò ...
Martijn Courteaux,

38
Lo faccio sempre nel negozio di mele
eggie5,

Risposte:


188

Se hai rmda GNU coreutils (molto probabilmente se si tratta di una normale distribuzione Linux), rm -rf /verrà rifiutato dalla protezione integrata (secondo manpage e Wikipedia, non l'ho provato).

È possibile ignorare questa protezione con --no-preserve-root. rmrimuoverà quindi tutto il possibile, senza fermarsi dopo aver tentato di rimuovere ogni singolo file. Ovviamente non rimuoverà i filesystem virtuali come /proce /sys, ma questo è irrilevante: rimuoverà tutto sul tuo disco.

Al termine del comando, il disco verrà cancellato vuoto, incluso il sistema operativo. Il kernel e i processi attuali continueranno a essere eseguiti dalla memoria, ma molti processi moriranno perché non riusciranno ad accedere ad alcuni file. Il sistema operativo non si avvierà la prossima volta.


67
Esattamente quello che stavo cercando. Ora usa questo potere per conquistare il mondo.
n0pe

34
+1 soprattutto per --no-preserve-rootperché di solito non è menzionato.
Matěj G.

22
@MaxMackie, vale la pena notare che gli hacker hanno scoperto molto rapidamente che questa era la cosa meno utile che potevano fare per un utente. Distrugge tutti i dati che potrebbero essere utilizzati per guadagni in denaro e impedisce all'hacker di sfruttare ulteriormente la macchina. Come un gatto con un insetto, non vuoi ucciderlo, vuoi solo giocarci un po 'perché è divertente.
zzzzBov,

5
Per rispondere all'altra domanda del PO, sì, si rimuoverà. È del tutto possibile modificare o eliminare un eseguibile anche mentre è in esecuzione un'istanza. Continuerà anche a funzionare e non sarà influenzato dal cambiamento.
thomasrutter,

3
Vorrei citare "chmod -R user: user *" su /, perché è anche un errore ricorsivo e costoso. L'ho fatto una volta, ed ero arrivato a metà strada verso casa prima che potessi abortire. / bin / boot / etc / dev erano di proprietà. Fortunatamente il server ha continuato a funzionare mentre ho trascorso le prossime ore manualmente e ripristinando le proprietà da un sistema di riferimento. Tuttavia, nessun altro poteva usare su o sudo in seguito. Alla fine ho scoperto che / bin / su non aveva più il suo setuid bit impostato. Prendi nota per il futuro: chowning / bin / su ripristina il suo bit setuid!
Andy Lee Robinson,


22

Configurare una macchina virtuale e provare per divertimento?

Andrà abbastanza lontano ... se stai usando una GUI potresti divertirti notando che le cose si degradano più visibilmente. (le icone nei menu interrompono il caricamento, ecc.)

Se lo lasci andare, il sistema operativo sarà praticamente al di là del recupero anche se potresti essere in grado di recuperare alcuni dati facilmente.

Ad ogni modo, vorrai fare una reinstallazione del sistema operativo.


7
Non ho nemmeno pensato di provarlo in una VM. Andiamo a provare ora! ooo questo è divertente.
n0pe

40
Scrive
erroneamente

1
Guarda l'articolo che ho pubblicato. "La classica storia dell'orrore Unix!"
akseli,

1
Sono al lavoro in questo momento e non ho tempo di passare attraverso un'installazione completa di una distribuzione popolare (ubuntu / slack / suse / fedora). Se qualcun altro può clonare un file su disco VM e provarlo per noi, sarebbe fantastico.
n0pe

2
Con Amazon EC2 dovrebbe essere veloce accendere uno dei loro AMI che hanno già installato Linux e sparare via ...
David d C e Freitas

11

Bene, provandolo su http://bellard.org/jslinux/ produce:

rm: impossibile rimuovere '/ dev / pts': dispositivo o risorsa occupata
rm: impossibile rimuovere '/ dev': directory non vuota
rm: impossibile rimuovere '/ proc / swaps': operazione non consentita
rm: can 't remove' / proc / kallsyms ': operazione non consentita
rm: impossibile rimuovere' / proc / dma ': operazione non consentita

SNIP 881 voci

rm: impossibile rimuovere '/ proc / 149 / oom_adj': autorizzazione negata
rm: impossibile rimuovere '/ proc / 149': operazione non consentita
rm: impossibile rimuovere '/ proc': dispositivo o risorsa occupata
rm: impossibile rimuovere '/ tmp': dispositivo o risorsa occupata
rm: impossibile rimuovere '/': dispositivo o risorsa occupata


1
Sì, ricevo anche quegli errori / avvertimenti. Pensi a questo standard?
n0pe

5
/ proc, / sys, a volte / dev e tutti i mountpoint sono proprietà del sistema operativo e non possono essere eliminati.
pjc50,

1
In accordo con @ pcj50, questi non sono letteralmente file sul disco rigido, quindi "eliminarli" non è significativo.
CarlF,

7

Ricordo che questo è stato masticato alt.sysadmin.recoverynei giorni precedenti, quando non esisteva nulla di simile /proc, ed /devera solo una normale directory contenente voci per un gruppo di inode insoliti ...

... ma, su alcune varianti di Unix (il mio ricordo è HP-UX, ma potrebbe essere totalmente sbagliato), non è stato possibile rimuovere l'ultima voce della directory per un programma in esecuzione. (Librerie condivise? Che cosa sono quelle?)

In tali sistemi, se hai iniziato uno in modalità di manutenzione (quindi niente era in funzione, ma la shell, nemmeno init, e sono stati montati nessun file system secondari) e ha fatto exec /bin/rm -rf /, si sarebbe lasciato con un file system di root completamente vuoto , tranne che /bine /bin/rmsarebbe sopravvivere.

Gli abitanti del monastero del diavolo spaventoso lo consideravano appropriato e appropriato.


4

rm -rf / non dovrebbe essere consentito su implementazioni recenti in quanto è stato suggerito che viola lo standard POSIX:

" rm -rf /" protezione sul blog Oracle

Comunque, alla fine, abbiamo modificato le specifiche e Solaris 10 ha (dalla build 36) una versione di / usr / bin / rm (/ bin è un link simbolico a / usr / bin su Solaris) e / usr / xpg4 / bin / rm che si comporta così:

[28] /bin/rm -rf /
rm of / is not allowed
[29] 

2
"sottolineando che se si tenta di rimuovere" / "in modo ricorsivo, alla fine si tenterà di rimuovere" .. "e". ", e tutto ciò che stiamo facendo è consentire a rm di determinarlo in modo euristico. Sorprendentemente, hanno acquistato ! "- Ehm, ciò non impedirebbe di rimuovere alcuna directory? Le specifiche effettive non consentono solo .. e. negli attuali argomenti della riga di comando, non dice nulla di ciò che "alla fine
provi

1
Perché non consentirebbe di rimuovere qualsiasi directory? La directory principale è l'unica qui interessata e la sua rimozione implica ovviamente la rimozione di "." e "..", qualunque sia la directory corrente. Il buon senso non è proibito nell'interpretazione standard.
jlliagre,

1
Quella linea di argomentazione è puro genio.
Nate CK,

Lo standard specifica che rm non può continuare se un argomento ha la stringa "." o ".." come componente basename. Non puoi rimuovere /foo/..anche se non ci sei /foo. Essa non specifica che non ti è permesso di rimuovere la directory corrente (per esempio rm -r `pwd`), o il genitore della directory corrente.
Casuale 832,

2
Anzi, ho frainteso l'affermazione e tu hai ragione. Speriamo che i ragazzi standard abbiano accettato il comportamento più intelligente come conforme allo standard. La rimozione di parti di grandi dimensioni se non tutto il file system renderebbe comunque il sistema operativo non conforme allo standard.
jlliagre,

3

Un punto che non ho visto fatto da nessun altro: i file che sono attualmente aperti (es. Rm stesso), anche se cancellati, in realtà non scompariranno dall'unità fino alla chiusura.


Esatto, perché sono caricati in memoria giusto?
n0pe

Non sono sicuro che sia sicuro presumere; il kernel potrebbe benissimo semplicemente caricare il file rimosso in memoria e rimuoverlo immediatamente sul disco, e mantenere questa copia in memoria fino a quando il file non è aperto (ad esempio fino a quando rm è in esecuzione).
Ambroz Bizjak,

Non sto speculando. Se un programma è in esecuzione, l'eliminazione non lo rimuove sui miei box Linux, almeno. (Intendiamoci, non lo provo da un paio d'anni.)
CarlF,

4
rm si rimuoverà da fs - il programma è completamente caricato in memoria, non il file
warren

4
@MaxMackie: non perché sono caricati in memoria, ma perché un riferimento a un file aperto ha la stessa potenza di un collegamento reale (ovvero se un file ha almeno un collegamento reale, non verrà eliminato dal disco).
Lie Ryan,

1

Per averlo provato una volta (su un server che mi fa incazzare), registrato come root, nel terminale, perderai quasi tutto. L'unica cosa che non verrà cancellata sarà solo il processo essenziale per il sistema operativo.


12
"[non cancellato] solo il processo che era essenziale per il sistema operativo" - oh, non ti preoccupare. A differenza di Windows, Linux cancellerà felicemente qualsiasi cosa, anche se il file è critico per il sistema operativo e in uso. /boot, /sbin, /etc, /bin, /vmlinuz? Bam, andato. Buona fortuna a fare il boot senza quelli - in effetti, buona fortuna a fare qualsiasi cosa una volta che l'eliminazione è terminata.
Piskvor,

Se ricordo che c'era un file che non era stato cancellato, e ho lasciato correre il mio linux per più di 4 ore. Tuttavia, è bello sapere cosa succede, come fare un chmod 777 / * -fR;)
Anarko_Bizounours

3
"chmod 777 / * -fR" - Questo dovrebbe rendere il sistema molto insicuro, sebbene molto intuitivo.
Bart van Heukelom il

1
@BartvanHeukelom, alcuni strumenti eseguiranno un rapido autotest o saranno testati dal sistema per la proprietà e le autorizzazioni appropriate e si rifiutano di agire in caso di configurazione errata.
assassino

1
chmod -fR 777 /è dannoso perché disattiva i bit setuid e setgid.
G-Man,

1

Quanto lontano puoi arrivare, dipende fondamentalmente dalle specifiche distribuzioni Unix / Linux.

Ma per rispondere alla tua domanda di base, sì - il rmcomando verrebbe rimosso con esso così come qualsiasi altro comando standard in /bine altre cartelle.

Ecco il semplice test che ho eseguito su Linux Ubuntu 15.04 usando VM.

  1. Inizializza la macchina virtuale tramite vagrant:

    vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh
    
  2. Quindi, quando stai cercando di rimuovere tutti i file in modo standard, non ti consente di:

    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. Quindi proviamo --no-preserve-root. Controlla sempre di aver effettuato l'accesso alla macchina virtuale (quindi stai avendo vagrant@vagrant-ubuntu-vivid-64:~$), quindi esegui (non provarlo a casa):

    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
    

    Dopodiché torna al prompt della shell come se nulla fosse appena accaduto, ma non è più possibile eseguire alcun comando a parte pochi comandi integrati e kill, quindi, è possibile terminare il lavoro e terminare la sessione :)

    Per esempio:

    $ 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.
    

Quindi è abbastanza rimosso tutto, compresi rm, lse tutti gli altri comandi, ma ancora si è registrato in. Ci sono alcune cartelle speciali che non sono stati rimossi, come alcuni dispositivi da /dev, /proco /sysche non sono regolari sono le directory / file, ma è pseudo-filesystem che fornisce interfacce per l'elaborazione e quelli del kernel.

Se non hai Vagrant o Linux, puoi giocare con alcuni emulatori JavaScript x86 Linux .

Se sei interessato alle possibilità di riprendersi da tale disastro, controlla:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.