Depois de cometer o infame erro de excluir todo o meu sistema de arquivos sudo rm -rf /*
, recuperar-me dos horríveis danos que eu havia causado e lidar com o fato de ter acabado de perder 6 anos da minha vida útil, comecei a me perguntar por que é possível fazer isso, e o que poderia ser feito para impedir que esse erro acontecesse.
Uma solução que me foi sugerida é revogar o acesso root da minha conta, mas isso é inconveniente, porque muitos comandos exigem acesso root e quando você precisa executar algumas dezenas de comandos todos os dias, isso fica irritante.
Fazer backup do seu sistema é o caminho óbvio. Mas restaurar um backup também requer algum tempo de inatividade e, dependendo do sistema, esse tempo de inatividade pode ser de dias ou semanas, o que pode ser inaceitável em alguns casos.
Minha pergunta é: Por que não implementar uma confirmação quando o usuário tenta excluir seu sistema de arquivos? Assim, quando você realmente quer fazer isso, basta pressionar Y ou entrar e, se não fizer, pelo menos, não perderá tudo.
fonte
/
que seriam quase tão ruins para excluir (/etc/
por exemplo). Simplesmente não é o trabalho derm
decidir quais diretórios podem ou não ser facilmente excluídos.Respostas:
rm
é uma ferramenta de sistema de baixo nível. Essas ferramentas são construídas da maneira mais simples possível e devem estar presentes em qualquer sistema.rm
é esperado que tenha um comportamento bem conhecido, especialmente com relação aos prompts de confirmação, para que possam ser usados em scripts.Adicionar um caso especial a ser solicitado
rm /*
não seria possível, pois o comando rm não o vê neste formulário. O*
curinga é expandido pelo shell antes de ser passado pararm
, portanto, o comando real que precisa de um caso especial seria algo comorm /bin /boot /dev /etc /home /initrd.img /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var /vmlinuz
. Adicionar o código para verificar esse caso (que provavelmente será diferente em linuxes diferentes) seria um desafio complexo, além de propenso a erros sutis. O linux padrãorm
tem uma proteção padrão contra a destruição do sistema, recusando-se a remover/
sem a--no-preserve-root
opção.Por padrão, existem três proteções contra a exclusão do sistema desta maneira:
Para remover todo o conteúdo de uma pasta, em vez de executá-lo
rm /path/to/folder/*
, faça issorm -rf /path/to/folder
,mkdir /path/to/folder
pois isso ativará a--preserve-root
proteção e removerá todos os arquivos de ponto da pastafonte
/
exigiria muitas combinações e considerações, por isso não é prático. E voltando à idéia de padrões, adicionar essas verificações quebraria o comportamento consistentesafe-rm
existe um invólucrorm
: dessa forma, ele pode verificar todos os argumentos (em vez de toda a linha de comando aleatória), verificar se não está na lista negra configurável e apenas chamarrm
com os argumentos verificados. Isso não é muito complexo nem propenso a erros.Conheça
safe-rm
, o "invólucro dorm
comando para evitar exclusões acidentais":Se o link de instalação acima não funcionar, basta usar
sudo apt install safe-rm
. A configuração padrão já contém os diretórios do sistema, vamos tentar,rm /*
por exemplo:Como você vê, isso impediria a exclusão
/home
, onde suponho que seus arquivos pessoais sejam armazenados. No entanto, isso não impede a exclusão~
ou nenhum de seus subdiretórios, se você tentar excluí-los diretamente. Para adicionar o~/precious_photos
diretório, basta adicionar seu caminho absoluto com o til resolvido parasafe-rm
o arquivo de configuração/etc/safe-rm.conf
, por exemplo:Para os casos em que você executa
rm
semsudo
1 e o-f
sinalizador, é uma boa ideia adicionar umalias
para o seu shell que tornerm
o-i
sinalizador padrão. Dessa forma,rm
solicita todos os arquivos antes de excluí-lo:Um sinalizador igualmente útil é o de
-I
que apenas alerta "uma vez antes de remover mais de três arquivos ou ao remover recursivamente", que é "menos invasivo do que-i
, ao mesmo tempo em que protege contra a maioria dos erros":O perigo geral desses aliases é que você adquire facilmente o hábito de confiar neles para salvá-lo, o que pode sair pela culatra mal ao usar um ambiente diferente.
1:
sudo
ignora aliases , pode-se contornar isso definindoalias sudo='sudo '
emborafonte
A confirmação já está lá, o problema está
-f
no comando, ou seja--force
; Quando o usuário força uma operação, supõe-se que ele saiba o que está fazendo (obviamente, um erro sempre pode ser acrescentado).Um exemplo:
É diferente com a
--force
opção: Não receberei nenhuma confirmação e os arquivos são excluídos.O problema é conhecer o comando e seus parâmetros, navegar mais no
man
comando (também se o comando for encontrado em um tutorial) para obter exemplos: na primeira vez em que vi o comandotar xzf some.tar.gz
, estou me perguntando "o quexzf
significa? "Então eu li a página de manual do alcatrão e a descobri.
fonte
-f
era necessário excluir pastas. Eu até abri um prompt para confirmar e reclamar, mas aprendi que apenas-r
é necessário. Suponho querm -rf
tenha se tornado a norma, pois é muito útil em um script (você não deseja que o script falhe apenas porque está tentando excluir coisas que não existem), para que você o veja com frequência, mas suponho que precisamos estar vigilante sobre apenas usarrm -r
como nosso "padrão" quando estiver em um shell (compreensivelmente não deve haver suposições "padrão" que você não entende, especialmente no sudo, mas as pessoas serão pessoas e, pelo menos, isso é mais seguro).rm
não solicita confirmação por padrão, apenas solicita diretórios e arquivos protegidos contra gravação. Se você executou esse comando em sua máquina, provavelmente excluiu muitos de seus próprios arquivos. Se você precisarrm
pedir confirmação, precisará passar o-i
parâmetro Por exemplo:rm -ir ./*
Executar sem backups significa que você deve ter muito cuidado para nunca cometer erros. E espero que seu hardware nunca falhe. (Mesmo o RAID não pode salvá-lo da corrupção do sistema de arquivos causada por falha na RAM.) Esse é o seu primeiro problema. (Presumo que você já tenha percebido e fará backups no futuro.)
Mas existem coisas que você pode fazer para reduzir a probabilidade de erros como este:
rm='rm -I'
para avisar se excluir mais de três itens.mv -i
ecp -i
(muitos casos de uso normais para esses não envolvem sobrescrever um arquivo de destino).sudo='sudo '
para fazer expansão alias no primeiro argumento parasudo
Eu acho que
rm -I
é muito mais útil querm -i
. Normalmente, ele não é solicitado durante o uso normal; portanto, a digitação é solicitada quando você não espera que seja um aviso muito mais perceptível / melhor. Com-i
(antes de descobrir-I
), me acostumei a digitar\rm
para desativar a expansão de alias, depois de ter certeza de que havia digitado o comando corretamente.Você não deseja adquirir o hábito de confiar
rm -i
ou usar-I
pseudônimos para salvá-lo . É sua linha de segurança que você espera que nunca seja usada. Se eu realmente quiser selecionar interativamente quais correspondências excluir ou se não tiver certeza se meu glob pode corresponder a alguns arquivos extras, digito manualmenterm -i .../*whatever*
. (Também é um bom hábito, caso você esteja em um ambiente sem seus pseudônimos).Defenda-se contra o dedilhado Enterdigitando
ls -d /*foo*
primeiro , depois a seta para cima e altere pararm -r
depois que você terminar de digitar. Portanto, a linha de comando nunca contémrm -rf ~/
comandos perigosos similares a qualquer momento. Você apenas o "arma", mudandols
pararm
com control-a, alt-d para ir para o início da linha e adicionando o-r
ou o-f
depois que você terminar de digitar a~/some/sub/dir/
parte do comando.Dependendo do que você está excluindo, execute o
ls -d
primeiro, ou não, se isso não adicionar nada ao que você vê com o preenchimento de guias. Você pode começar comrm
(sem-r
ou-rf
), então é apenas control-a / control-right (ou alt + f) / space /-r
.(Acostume-se com as poderosas combinações de teclas de edição do readline para mover-se rapidamente, como setas de controle ou alt + f / b para mover por palavras e matar palavras inteiras com alt + backspace ou alt + d ou control-w. -u para matar o início da linha. E controle- / para desfazer uma edição se você for um passo longe demais. E, é claro, o histórico da seta para cima que você pode pesquisar com control-r / control-s.)
Evite, a
-rf
menos que você realmente precise silenciar as solicitações sobre a remoção de arquivos somente leitura.Reserve um tempo extra para pensar antes de pressionar retornar em um
sudo
comando. Especialmente se você não tiver backups completos, ou agora seria um momento ruim para restaurá-los.fonte
Bem, a resposta curta é não executar esse comando.
A longa história é que isso faz parte da personalização. Essencialmente, existem dois fatores em jogo aqui. Um é o fato de você poder modificar todos os arquivos.
A segunda é que o comando rm oferece o açúcar sintático útil para excluir todos os arquivos em uma pasta.
Efetivamente, isso poderia ser reafirmado como um princípio simples e simples de máquinas Unix. Tudo é um arquivo . Para melhorar as coisas, há controles de acesso, mas eles são substituídos pelo uso de
Eu acho que você pode adicionar um alias ou uma função para garantir que isso nunca possa ser executado.
fonte
Se o uso do espaço no arquivo do sistema não for imenso (e hoje em dia, 'imenso' significa 'centenas de gigabytes ou mais'), crie algumas instâncias da máquina virtual e sempre trabalhe dentro de uma. A recuperação implicaria apenas o uso de uma instância de backup.
Ou você pode criar uma prisão chroot e trabalhar dentro dela. Você ainda precisaria de alguma recuperação se ela fosse lixeira, mas seria mais fácil trabalhar com um sistema em execução (fechado).
fonte
rm
porsafe-rm
ajuda, pelo menos..project_root
ou, se o sistema de arquivos o suportar, um atributo no próprio diretório. Em seguida, o script subia na árvore de arquivos procurando a raiz do projeto e reclamava que o diretório atual não estava em um projeto. Ou, se todos os projetos estiverem no mesmo local, o script poderá exigir que você nomeie um projeto. Você ainda pode excluir o projeto errado, mas não destruir o sistema inteiro.chroot
seria usar algo como o Docker (que eu acho que realmente usachroot
debaixo das cobertas). Para outros arquivos que você só precisa ler, monte um sistema de arquivos somente leitura.rm
é um comando Unix muito antigo e provavelmente não foi projetado com a facilidade de uso em mente. Ele tenta fazer exatamente o que é solicitado, quando possui as permissões. Uma armadilha para muitos usuários novos é que eles frequentemente veem o códigosudo
e não pensam muito em usá-lo. Funções que modificam diretamente arquivos comorm
,dd
,chroot
, etc. exigem extremo cuidado em uso.Hoje em dia eu gosto de usar
trash
(sem sudo) do lixo-cli . Funciona como a Lixeira do Windows, na qual você pode recuperar facilmente arquivos excluídos acidentalmente. O Ubuntu já possui uma pasta Lixeira e a funcionalidade mover para o lixo incorporada ao Files.Mesmo assim, você pode cometer erros, portanto, faça backups de todo o seu sistema de arquivos.
fonte