Como proibir a execução de / bin / rm -f *?

6

Não consigo lembrar quantas vezes listei um subdiretório e executei /bin/rm -f * no diretório atual. Alguém pode dar sugestões para me ajudar a evitar isso? O que devo fazer se eu quiser que o sistema me avise do perigo quando tento executar /bin/rm -f * ?

    
por ct586 25.03.2013 / 13:17

4 respostas

9

zsh por padrão solicita confirmação, quando você tenta executar qualquer comando chamado rm com * como uma palavra inteira na linha de comando (um recurso herdado de tcsh , embora em tcsh , seja não habilitado por padrão).

$ rm -rf *
zsh: sure you want to delete all the files in / [yn]?

Se você tiver que usar bash, com versões recentes de bash , você poderia fazer algo próximo usando extdebug e DEBUG trap:

shopt -s extdebug
check_for_rm_star() {
  case $1 in
    (rm*[\ /]"* "* | rm*[\ /]\*)
      read -p "check_for_rm_star: Are you sure? " -n1 answer < /dev/tty > /dev/tty
      echo > /dev/tty
      [[ $answer == [yY] ]]
  esac
}
trap 'check_for_rm_star "$BASH_COMMAND"' DEBUG

Isso é simplista e funcionaria para rm * e os casos mais comuns, mas não para rm "*" ou /bin/rm * ou : $(rm *) , mas você entendeu. Idealmente, precisaríamos analisar $BASH_COMMAND da mesma forma que o shell para ver se o primeiro argumento se expande para rm ou */rm e para ver se ele passou por um * sem aspas, mas isso pode ' t realmente ser feito de uma forma à prova de balas.

    
por 25.03.2013 / 13:52
2

Uma possibilidade é criar um alias de shell para mapear rm para um comando menos destrutivo. Por exemplo:

alias rm='trash'  # from the package trash-cli

Isso não exclui os arquivos, mas os coloca na lixeira, para que você possa restaurá-los. No entanto, isso altera a semântica do comando rm (é possível excluir diretórios inteiros sem -r , por exemplo). Além disso, não ajuda se o caminho completo for usado.

Outra possibilidade é configurar um backup regular, digamos uma vez por hora. Dessa forma, você pode excluir arquivos com prazer e restaurá-los mais tarde.

    
por 25.03.2013 / 13:25
2

A única maneira de fazer isso é substituir o próprio rm.

Existe um script wrapper para o rm que pretende fornecer um rm seguro, que pode ser encontrado em LaunchPad . Daquela página:

Safe-rm is a safety tool intended to prevent the accidental deletion of important files by replacing /bin/rm with a wrapper, which checks the given arguments against a configurable blacklist of files and directories that should never be removed.

O único problema que vejo com isso é que o exemplo de exemplo "perigoso" de rm é executado com o caminho completo, /bin/rm . Então você não poderia colocar este script wrapper em um diretório anterior em seu $ PATH, e deixá-lo ser encontrado quando você rodar o rm, e ter o rm "normal" desembrulhado disponível digitando o caminho completo, / bin / rm, como você faça acima.

    
por 25.03.2013 / 13:25
0

Uma solução simples é adicionar alias rm="rm -i" , então você será perguntado antes de cada remoção, se tiver certeza. Mas, como apontado por um dos meus professores, isso pode te enganar que o sistema unix que você está usando é um lugar seguro e quente, e isso pode ser ainda mais perigoso do que correr acidentalmente rm *

    
por 25.03.2013 / 13:27

Tags