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

8

Eu acho que muitas pessoas aqui por engano ' rm -rf' ed o diretório errado, e espero que não tenha causado um grande dano. Existe alguma maneira de impedir que os usuários façam uma história de terror unix semelhante ? Alguém mencionou (na seção de comentários do link anterior ) que

... Eu tenho certeza que agora todos os cursos ou empresas unix que usam unix sets rm -fr para desativar contas de pessoas tentando executá-lo ou impedi-lo de executá-lo ...

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

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

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

amyassin
fonte
11
1) Gerenciamento de alterações 2) Backups.
mattdm
6
provavelmente a única maneira seria substituir o rmcomando por um que não possua esse recurso.
Keith
2
safe-rm talvez
sr_
2
a maioria das distros faz `alias rm = 'rm -i', o que faz com que rm pergunte se você tem certeza. além disso: saiba o que está fazendo. somente se torne raiz se necessário. para qualquer usuário com privilégios de root, qualquer tipo de segurança deve ser implementada no e pelo usuário. contrate alguém se você não puder fazer isso sozinho. Com o tempo, qualquer contramedida se tornará equivalente à linha de apelido acima, se você não conseguir entender o problema.
Bananguin
1
@amyassin using rm -rfpode ser um evento de geração de currículo. Verifique e verificação tripla antes de executá-lo
midnightsteel

Respostas:

15

Para evitar um erro rm -rf, não digiterm -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 DELETEe verifique se é realmente o que você deseja excluir
  • rm -rf DELETE

Nunca ligue rm -rfcom um argumento que não seja DELETE. A exclusão em várias etapas dá a você a oportunidade de verificar se você não está excluindo a coisa errada, seja por causa de um erro de digitação (como em rm -rf /foo /barvez de rm -rf /foo/bar) ou por causa de um braino (opa, não, eu pretendia excluir foo.olde manter foo.new) .

Se o seu problema é que você não pode confiar em outras pessoas para não digitar rm -rf, considere remover os 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 anuláveis rm, substitua (ou melhor sombra) rmpor um script personalizado que rejeite certos argumentos. Ou por hg rm.

Algumas variantes do unix oferecem mais possibilidades.

  • No OSX, você pode definir uma lista de controle de acesso em um diretório, impedindo a exclusão dos arquivos e subdiretórios dentro dele, sem impedir a criação de novas entradas ou a modificação das entradas existentes: chmod +a 'group:everyone deny delete_child' somedir(isso não impede a exclusão dos arquivos nos subdiretórios: se Se desejar, defina também a ACL no subdiretório).
  • No Linux, você pode definir regras no SELinux, AppArmor ou outras estruturas de segurança que proíbem rmmodificar determinados diretórios.
Gilles 'SO- parar de ser mau'
fonte
Sim fazer o backup é a solução mais incrível, mas eu estava pensando em algo como a --no-preserve-rootopção, por outra pasta importante .. E que, aparentemente, não existe ainda como uma prática ...
amyassin
Eu editei a pergunta para indicar o que eu quero mais ...
amyassin
1
@ amyassin Acho que não há mais nada (pelo menos não no Linux). rm -rfjá significa "excluir isso, sim, tenho certeza que sei o que estou fazendo". Se você quiser mais, substitua rmpor um script que se recuse a excluir determinados diretórios.
Gilles 'SO- stop be evil'
Por favor, edite o último comentário para a pergunta, pois acho que está respondendo bem à pergunta ...
amyassin
2
@amyassin Na verdade, eu retiro isso. Não há mais nada no Linux tradicional, mas você pode definir regras para o Apparmor / SELinux /… que impedem o rmacesso a determinados diretórios. Além disso, como sua pergunta não é apenas sobre Linux, eu deveria ter mencionado o OSX, que tem algo parecido com o que você deseja.
Gilles 'SO- stop be evil'
4

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

setopt rmstarwait

Agora o shell avisa quando você estiver 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 rejeita ( n), nada acontece. Caso contrário, todos os arquivos serão excluídos.

qbi
fonte
Para que é zsh -futilizado?
James
3

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

Por exemplo: Você tem um diretório chamado rmtestcom o arquivo chamado -iinside. Se você tentar rmtudo dentro do diretório, rmserá -ipassado primeiro a ele e entrará no modo interativo. Se você colocar esse arquivo dentro dos diretórios nos quais gostaria de ter alguma proteção, isso poderá ajudar.

Observe que isso é ineficaz contra rm -rf rmtest.

Silverrocker
fonte
Eu editei a pergunta para indicar o que eu quero mais ...
amyassin
Truque impressionante! O arquivo é facilmente criado com> -i
capitano666 14/05
2

EDIT como 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 nem pela raiz 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 maneira, mesmo pela raiz . Outro atributo aparentemente disponível que eu ainda não usei é o atributo append ( chattr +a /some/important/file. O arquivo pode ser aberto apenas no modo append, o que significa que não há exclusão também, mas você pode adicioná-lo (por exemplo, um arquivo de log). não poderá editá-lo, vimpor exemplo, mas você pode fazê-lo echo 'this adds a line' >> /some/important/file. Usar em >vez de >>falhará.

Esses atributos podem ser desabilitados usando um sinal de menos, ou seja, chattr -i file

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

Drake Clarris
fonte
Eu editei a pergunta para indicar o que eu quero mais ...
amyassin
2

Se você entende a linguagem de programação C, acho que é possível reescrever o código-fonte rm e fazer um pequeno patch para o kernel. 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.

ValeriRangelov
fonte
1

Uma opção possível é parar de usar rm -rfe começar a usar rm -ri. O iparâmetro extra existe para garantir que ele pergunte se você tem certeza de que deseja excluir o arquivo.

Provavelmente, sua melhor aposta seria alias de rm -rialgo memorável kill_it_with_fire. Dessa forma, sempre que lhe apetecer remover algo, vá em frente e mate-o com fogo.

NlightNFotis
fonte
1
Eu gosto do nome, mas não fé exatamente o oposto da iopção ?? Eu tentei e funcionou ...
amyassin
@amyassin Sim, é. Para algum tipo estranho de moda, eu pensei que só tinha rlá. Apenas consertei.
NLNNototis
Eu editei a pergunta para indicar o que eu quero mais ...
amyassin
-1

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

$ rm /directoryname -rf
kieranwild
fonte
5
isso viola as diretrizes do POSIX.
gelraen
Eu editei a pergunta para indicar o que eu quero mais ...
amyassin