Como evitar um erro rm -rf para pastas específicas?

8

Acho que as pessoas aqui por engano ' rm -rf ' o diretório errado, e espero que ele não causou um grande dano .. Existe alguma maneira de impedir que os usuários façam um similar história de horror do Unix Alguém mencionou (na seção de comentários do link anterior ) que

... I am pretty sure now every unix course or company using unix sets rm -fr to disable accounts of people trying to run it or stop them from running it ...

Existe alguma implementação disso em qualquer distribuição Unix ou Linux atual? E qual é a prática comum para evitar esse erro, mesmo de um sysadmin (com acesso root)?

Parece que houve alguma proteção para o diretório raiz ( / ) em Solaris (desde 2005) e GNU (desde 2006). Existe alguma maneira de implementar o mesmo caminho de proteção para algumas outras pastas também?

Para dar mais clareza, eu não estava perguntando sobre conselhos gerais sobre rm usage (e atualizei o título para indicar mais), eu quero algo mais parecido com a proteção da pasta raiz: para rm -rf / você tem que passar um parâmetro específico: rm -rf --no-preserve-root / .. Existem implementações semelhantes para o conjunto personalizado de diretórios? Ou posso especificar arquivos além de / para serem protegidos pela opção preserve-root ?

    
por amyassin 20.01.2013 / 18:26

7 respostas

14

Para evitar um erro rm -rf , não digite rm -rf .

Se você precisar excluir uma árvore de diretórios, recomendo o seguinte fluxo de trabalho:

  • Se necessário, mude para o pai do diretório que você deseja excluir.
  • mv directory-to-delete DELETE
  • Explore DELETE e verifique se é realmente o que você queria excluir
  • rm -rf DELETE

Nunca chame rm -rf com um argumento diferente de DELETE . Fazer a exclusão em vários estágios dá a você a oportunidade de verificar se não está excluindo a coisa errada, seja devido a um erro de digitação (como em rm -rf /foo /bar em vez de rm -rf /foo/bar ) ou devido a um braino (oops, não, eu significou excluir foo.old e manter foo.new ).

Se o seu problema é que você não pode confiar nos outros para não digitar rm -rf , considere remover seus privilégios de administrador. Há muito mais que pode dar errado do que rm .

Sempre faça backups .

Verifique periodicamente se seus backups estão funcionando e atualizados.

Mantenha tudo o que não pode ser baixado facilmente de algum lugar sob controle de versão.

Com um sistema unix básico, se você realmente deseja tornar alguns diretórios undeletable por rm , substitua (ou melhor sombra) rm por um script personalizado que rejeita certos argumentos. Ou por hg rm .

Algumas variantes unix oferecem mais possibilidades.

  • No OSX, você pode definir uma lista de controle de acesso em um diretório que impeça a exclusão dos arquivos e subdiretórios dentro dela. sem impedir a criação de novas entradas ou modificação de entradas existentes: chmod +a 'group:everyone deny delete_child' somedir (isso não impede a exclusão de arquivos em subdiretórios: se você quiser, configure a ACL no subdiretório também).
  • No Linux, você pode definir regras no SELinux, no AppArmor ou em outras estruturas de segurança que proíbem rm de modificar determinados diretórios.
por 22.01.2013 / 01:18
4

Se você estiver usando rm * e o zsh, poderá definir a opção rmstarwait :

setopt rmstarwait

Agora o shell avisa quando você está usando o * :

> zsh -f
> setopt rmstarwait
> touch a b c
> rm *
zsh: sure you want to delete all the files in /home/unixuser [yn]? _

Quando você o rejeitar ( n ), nada acontece. Caso contrário, todos os arquivos serão excluídos.

    
por 22.01.2013 / 22:29
2

EDIT conforme sugerido pelo comentário:

Você pode alterar o atributo de para imutável o arquivo ou diretório e, em seguida, ele não pode ser excluído até mesmo pelo root até que o atributo seja removido.

chattr +i /some/important/file

Isso também significa que o arquivo não pode ser gravado ou alterado de qualquer forma, até mesmo pelo root . Outro atributo aparentemente disponível que eu não usei é o atributo append ( chattr +a /some/important/file . Então o arquivo só pode ser aberto no modo append, o que significa não excluir também, mas você pode adicionar a ele (digamos, um arquivo de log). Isso significa que você não poderá editá-lo em vim , por exemplo, mas poderá fazer echo 'this adds a line' >> /some/important/file . O uso de > em vez de >> falhará.

Estes atributos podem não ser definidos usando um sinal de menos, ou seja, chattr -i file

Caso contrário, se isso não for adequado, uma coisa que pratico é sempre ls /some/dir primeiro, e então, em vez de digitar novamente o comando, pressione a seta para cima CTL-A, exclua ls e digite my rm -rf se eu precisar. Não é perfeito, mas olhando para os resultados de ls, você sabe de antemão se é o que você queria.

    
por 22.01.2013 / 15:11
2

Para proteger contra um rm -rf * acidental em um diretório, crie um arquivo chamado "-i" (você pode fazer isso com o emacs ou algum outro programa) nesse diretório. O shell tentará interpretar -i e fará com que ele entre no modo interativo.

Por exemplo: Você tem um diretório chamado rmtest com o arquivo chamado -i inside. Se você tentar rm de tudo dentro do diretório, rm primeiro obterá -i passado para ele e entrará no modo interativo. Se você colocar esse arquivo dentro dos diretórios nos quais gostaria de ter alguma proteção, isso pode ajudar.

Note que isso é ineficaz contra rm -rf rmtest .

    
por 22.01.2013 / 15:46
1

Uma possível escolha é parar de usar rm -rf e começar a usar rm -ri . O parâmetro i extra para certificar-se de que ele pergunta se você tem certeza de que deseja excluir o arquivo.

Provavelmente, sua melhor aposta seria usar alias rm -ri em algo memorável como kill_it_with_fire . Desta forma, sempre que você sentir vontade de remover alguma coisa, vá em frente e mate-a com fogo.

    
por 22.01.2013 / 09:27
1

Se você entende a linguagem de programação C, eu acho que é possível reescrever o código fonte da rm e fazer um pequeno patch para o kernel. Eu vi isso em um servidor e era impossível excluir alguns diretórios importantes e quando você digita 'rm -rf / direcotyr' ele envia um email para o sysadmin.

    
por 21.12.2014 / 04:03
-1

Eu gosto de colocar o nome do diretório primeiro assim:

$ rm /directoryname -rf
    
por 22.01.2013 / 03:08