Até onde você chegará com um comando 'rm -rf /'?

200

Eu sempre me perguntei até onde o sistema realmente chegaria se você executar rm -rf /. Duvido que o sistema operacional possa se apagar (?)

Pergunta bônus : Depois que o comando for executado, ele será rmremovido?

Atualização: testei isso em algumas das principais distribuições unix usando o VirtualBox e as respostas descrevem exatamente o que acontece. Se os parâmetros corretos forem fornecidos, a rm removerá todos os bits físicos de dados do disco. No entanto, tive alguns problemas ao usar uma versão do rm diferente da GNU. Por exemplo, acredito que o BusyBox tem sua própria versão e não permite remover o máximo possível.

Esta pergunta foi uma pergunta da semana para superusuários .
Leia a entrada do blog de 7 de julho de 2011 para obter mais detalhes ou envie sua própria pergunta da semana.

n0pe
fonte
8
É engraçado que você fez essa pergunta. Eu estava apenas respondendo outra pergunta rm -f em outro fórum e comecei a lembrar de um artigo que li há algum tempo. Felizmente, salvei-o para momentos como este: A clássica história de terror do Unix Além do fato de ser interessante ver até onde vai chegar ... Eu acho que é um artigo muito bem escrito e geralmente é uma boa leitura!
Akseli
3
Acabei de experimentar o sudo rm -rf /tinycore / microcore linux e parece que o sistema operacional protege vários diretórios (/ sys e outros) da exclusão.
N0pe 20/07
47
Eu tentei rm -f /bin/rmuma vez. Infelizmente, funcionou, e passei a próxima hora obtendo a versão correta de rmvolta do GNU coreutils.
squircle
17
Espere um pouco, vou tentar ...
Martijn Courteaux
38
Eu faço isso na Apple Store o tempo todo
eggie5

Respostas:

188

Se você possui o rmGNU coreutils (provavelmente se é uma distribuição Linux normal), rm -rf /será recusado pela proteção integrada (de acordo com o manual e a Wikipedia, ainda não tentei).

Você pode substituir essa proteção por --no-preserve-root. rmirá remover tudo o que puder, sem parar depois de tentar remover todos os arquivos. Claro que não removerá sistemas de arquivos virtuais como /proce /sys, mas isso é irrelevante - removerá tudo no seu disco.

Após a conclusão do comando, seu disco será limpo vazio, incluindo o sistema operacional. O kernel e os processos atuais continuarão sendo executados a partir da memória, mas muitos processos morrerão porque não conseguirão acessar algum arquivo. O SO falhará ao inicializar na próxima vez.

Ambroz Bizjak
fonte
67
Exatamente o que eu estava procurando. Agora, use esse poder para dominar o mundo.
N0pe 20/07
34
+1 especialmente para, --no-preserve-rootporque isso geralmente não é mencionado.
Matěj G.
22
@ MaxMackie, vale a pena notar que os hackers rapidamente descobriram que isso era a coisa menos útil que eles poderiam fazer para um usuário. Destrói todos os dados que poderiam ser usados ​​para ganhos de caixa e impede que o hacker explore ainda mais a máquina. Como um gato com um inseto, você não quer matá-lo, você só quer brincar com ele por um tempo porque é divertido.
zzzzBov
5
Para responder à outra pergunta do OP, yes rm se removerá. É perfeitamente possível modificar ou excluir um executável, mesmo enquanto houver uma instância em execução. Ele continuará funcionando também e não será afetado pela alteração.
thomasrutter
3
Gostaria de mencionar "chmod -R user: user *" em /, porque também é um erro recursivo e caro. Fiz isso uma vez e já estava na metade de casa quando pude abortar. / bin / boot / etc / dev eram de propriedade. Felizmente, o servidor continuou funcionando enquanto eu passava as próximas horas manualmente e redefinindo as propriedades de um sistema de referência. No entanto, ninguém mais poderia usar su ou sudo posteriormente. Eventualmente, descobriu que / bin / su não tinha mais o bit setuid definido. Tome nota para o futuro: chowning / bin / su redefine seu bit setuid!
Andy Lee Robinson
42

Para quem gosta de fazer coisas assim visualmente enquanto ouve música techno.

Executando rm-rf no Linux (vídeo)

Pontos de bônus se você puder nomear os processos quando eles começarem a morrer.

Xeoncross
fonte
22

Configurar uma VM e tentar se divertir?

Vai muito longe ... se você estiver usando um GUI, poderá se divertir percebendo que as coisas se degradam mais visivelmente. (os ícones nos menus param de carregar, etc.)

Se você deixar para lá, o sistema operacional estará praticamente além da recuperação, embora você possa recuperar alguns dados facilmente.

De qualquer forma, você desejará reinstalar o sistema operacional.

PriceChild
fonte
7
Eu nem pensei em tentar em uma VM. Vai tentar agora! ooo, isso é divertido.
N0pe
40
Equivocadamente escreve o comando do sistema host Terminal
slhck
11
Confira o artigo que publiquei. "A clássica história de terror do Unix!"
Akseli
11
Estou no trabalho agora e não tenho tempo para fazer a instalação completa de uma distribuição popular (ubuntu / slack / suse / fedora). Se alguém mais puder clonar um arquivo de disco da VM e experimentá-lo, seria incrível.
N0pe 20/07
2
Com EC2 Amazon deve ser rápido para o fogo até um dos seus AMI do que já linux instalado e fogo afastado ...
David d C e Freitas
11

Bem, experimentá-lo em http://bellard.org/jslinux/ produz:

rm: não é possível remover '/ dev / pts': Dispositivo ou recurso ocupado
rm: não é possível remover '/ dev': Diretório não vazio
rm: não é possível remover '/ proc / swaps': Operação não permitida
rm: pode 't remove' / proc / kallsyms ': Operação não permitida
rm: não é possível remover' / proc / dma ': Operação não permitida

Entradas SNIP 881

rm: não é possível remover '/ proc / 149 / oom_adj': permissão negada
rm: não é possível remover '/ proc / 149': Operação não permitida
rm: não é possível remover '/ proc': Dispositivo ou recurso ocupado
rm: não é possível remover '/ tmp': dispositivo ou recurso ocupado
rm: não é possível remover '/': dispositivo ou recurso ocupado

Hello71
fonte
11
Sim, eu também recebo esses erros / avisos. Você acha que esse padrão é?
N0pe 20/07
5
/ proc, / sys, às vezes / dev e quaisquer pontos de montagem são propriedades do sistema operacional e não podem ser excluídos.
Pjc50
11
Concordando com @ pcj50, esses arquivos não são literalmente arquivos no disco rígido, portanto, "excluí-los" não é significativo.
21811 CarlF
7

Lembro-me de ter sido devorada alt.sysadmin.recoverynos dias de outrora, quando não existia /proc, e /devera apenas um diretório regular contendo entradas para vários inodes incomuns ...

... mas, em algumas variantes de Unix (minha lembrança é HP-UX, mas que poderia ser totalmente errado), você pode não remover a última entrada de diretório para um programa que estava sendo executado. (Bibliotecas compartilhadas? O que são essas?)

Em tais sistemas, se você começou um up no modo de manutenção (para que nada estava funcionando, mas sua concha, nem mesmo init, e sem sistemas de arquivos secundários foram montados) e se exec /bin/rm -rf /, você ficaria com um sistema de arquivos raiz completamente vazio , exceto que /bine /bin/rmseria sobreviver.

Os habitantes do mosteiro assustador do diabo consideraram isso apropriado e adequado.

zwol
fonte
4

rm -rf / não deve ser permitido em implementações recentes, pois foi sugerido que viola o padrão POSIX:

" rm -rf /" proteção no blog Oracle

De qualquer forma, no final, modificamos as especificações, e o Solaris 10 tem (desde a compilação 36) uma versão de / usr / bin / rm (/ bin é um link simbólico para / usr / bin no Solaris) e / usr / xpg4 / bin / rm que se comporta assim:

[28] /bin/rm -rf /
rm of / is not allowed
[29] 
jlliagre
fonte
2
"salientando que, se alguém tentar remover" / "recursivamente, acabará tentando remover" .. "e". ", e tudo o que estamos fazendo é permitir que a rm determine isso heuristicamente. Surpreendentemente, eles compraram ! "- er, isso não permitiria remover nenhum diretório? A especificação real não permite apenas .. e. nos argumentos de linha de comando reais, ele não diz nada sobre o que "em última análise, tentar remover"
Random832
11
Por que não seria permitido remover qualquer diretório? O diretório raiz é o único envolvido aqui e removê-lo obviamente implica remover "." e "..", qualquer que seja o diretório atual. O senso comum não é proibido na interpretação padrão.
Jlliagre
11
Essa linha de argumentação é pura genialidade.
Nate CK
O padrão especifica que rm não tem permissão para continuar se um argumento tiver a sequência "." ou ".." como o componente do nome da base. Você não pode remover /foo/.., mesmo se você não está em /foo. Ele não especifica que você não tem permissão para remover o diretório atual (por exemplo rm -r `pwd`) ou o pai do diretório atual.
usar o seguinte código
2
Na verdade, eu não entendi bem a afirmação e você está correto. Felizmente, o pessoal padrão aceitou o comportamento mais inteligente como sendo compatível com o padrão. A remoção de peças grandes, se não todo o sistema de arquivos, tornaria rapidamente o SO não compatível com os padrões.
Jlliagre
3

Um ponto que não vi de mais ninguém: os arquivos que estão abertos no momento (por exemplo, a própria rm), mesmo que sejam excluídos, na verdade não desaparecem do disco até serem fechados.

CarlF
fonte
Está certo, porque eles estão carregados na memória, certo?
N0pe 20/07
Não tenho certeza se é seguro assumir isso; o kernel pode muito bem carregar o arquivo removido na memória e removê-lo no disco imediatamente, e manter essa cópia na memória até que o arquivo seja aberto (por exemplo, até que a rm esteja em execução).
Ambroz Bizjak
Eu não estou especulando. Se um programa estiver em execução, excluí-lo não o remove nas minhas caixas Linux, pelo menos. (Lembre-se de que eu não testei isso em dois anos.) #
CarlF
4
rm irá remover-se dos fs - o programa está completamente carregado na memória, não o arquivo
Warren
4
@MaxMackie: não porque eles estejam carregados na memória, mas porque uma referência de arquivo aberto tem o mesmo poder de um link físico (ou seja, se um arquivo tiver pelo menos um link físico, ele não será excluído do disco).
Lie Ryan
1

Por ter tentado uma vez (em um servidor que me irrita), registrado como root, no terminal, você perderá quase tudo. A única coisa que não será apagada será apenas o processo essencial para o sistema operacional.

Anarko_Bizounours
fonte
12
"[não apagado] apenas o processo essencial para o sistema operacional" - oh, não se preocupe. Ao contrário do Windows, o Linux será feliz apagar qualquer coisa, mesmo se o arquivo for OS-crítica e em uso. /boot, /sbin, /etc, /bin, /vmlinuz? Bam, se foi. Boa sorte ao inicializar sem eles - na verdade, boa sorte fazendo qualquer coisa assim que a exclusão for concluída.
Piskvor
Se bem me lembro, havia algum arquivo que não foi excluído e deixei meu Linux funcionar por mais de 4 horas. Mas ainda assim, é bom saber o que aconteceu, como fazer um chmod 777 / * -FR;)
Anarko_Bizounours
3
"chmod 777 / * -fR" - Isso deve tornar o sistema muito inseguro, embora muito fácil de usar.
Bart van Heukelom 26/07/11
11
@BartvanHeukelom, algumas ferramentas executam um autoteste rápido ou são testadas pelo sistema para propriedade e permissões adequadas e se recusam a agir se configuradas incorretamente.
Killermist
11
chmod -fR 777 /é prejudicial porque desativa os bits setuid e setgid.
G-Man
1

Até onde você pode chegar, depende basicamente das distribuições específicas do Unix / Linux.

Mas, para responder à sua pergunta básica, o rmcomando yes - seria removido com ele, assim como qualquer outro comando padrão dentro /bine outras pastas.

Aqui está o teste simples que eu executei no Linux Ubuntu 15.04 usando VM.

  1. Inicialize a máquina virtual via vagrant:

    vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh
    
  2. Então, quando você está tentando remover todos os arquivos da maneira padrão, não permite:

    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. Então vamos tentar --no-preserve-root. Sempre verifique vagrant@vagrant-ubuntu-vivid-64:~$novamente se você está conectado à máquina virtual (para ter ) e depois execute (não tente fazer isso em 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
    

    Depois disso, ele volta ao prompt do shell como se nada tivesse acontecido, mas você não pode mais executar nenhum comando além de alguns integrados e kill, para que você possa terminar seu trabalho e encerrar sua sessão :)

    Por exemplo:

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

Então é muito removido tudo, inclusive rm, lse todos os outros comandos, mas ainda assim você está conectado. Existem algumas pastas especiais que não foram removidas, como alguns dispositivos /dev, /procou /sysque não são diretórios / arquivos regulares, mas o pseudo-sistema de arquivos fornece interfaces para processar e processar dados do kernel.

Se você não possui o Vagrant ou o Linux, pode jogar com alguns emuladores JavaScript Linux x86 .

Se você estiver interessado nas possibilidades de se recuperar desse desastre, verifique:

kenorb
fonte