Como posso bloquear a execução de rm -rf * em um shell do Linux?

2

Eu tenho o hábito de digitar rm -rf * toda vez que estou em algum tipo de modo de espera. Parece que meu subconsciente quer que eu exclua tudo o que eu codifico no final do dia.

Existe uma maneira de bloquear este comando específico ( rm -rf * ) no Linux no C-shell ou no bash-shell?

Como alternativa, existe uma maneira em que eu possa configurar um filtro de comando para minhas entradas de shell antes de ir para o shell para processamento adicional?

    
por 3498DB 13.12.2011 / 15:31

12 respostas

5

Confira safe-rm que é um wrapper para rm que permitirá que você configure uma lista de diretórios importantes que não podem ser excluídos acidentalmente.

Isso não impedirá a exclusão acidental de arquivos fora dos diretórios listados, mas evitará uma catástrofe quando o subconsciente decidir aumentar a aposta e executar um rm -rf / .

Além disso, a maneira canônica de evitar a exclusão acidental é usar alias rm="rm -i" como mencionado em várias outras respostas.

Medidas extremas para situações extremas ...

Se você é subconsciente é tão malicioso quanto parece, ele ainda pode ignorar isso usando /bin/rm para pular o alias. Para alguma proteção contra isso, crie um arquivo chamado -i nos diretórios nos quais você trabalha frequentemente:

[me@home]$ touch -- -i
[me@home]$ ls
-i    file1.txt    file2.txt

Quando você usa o /bin/rm -rf * , o curinga é expandido para a lista de arquivos que começa com -i e isso será visto como uma opção por /bin/rm :

[me@home]$ /bin/rm -rf *
/bin/rm: remove regular empty file 'file1.txt'?

(passe o mouse sobre o bloco seguinte quando seu subconsciente não estiver olhando ...)

Now let's hope your subconscious is not aware of the -- option...

    
por 13.12.2011 / 15:38
4

Você deve conseguir fazer isso usando o comando alias. Essa é a mesma coisa que, por exemplo converte rm para rm -i para evitar que você exclua apenas as coisas sem primeiro confirmar.

    
por 13.12.2011 / 15:33
1

Todos os outros estão sugerindo o aliasing rm to rm -i . Isso normalmente é uma boa solução. O problema é que não vai funcionar no seu caso. Você sempre usa -rf após rm . Seu comando se tornará rm -i -rf * e, como o -f vem depois do -i, ele substituirá o -i.

Você pode escrever um wrapper que verifique -rf e avisa antes de executar rm .

    
por 13.12.2011 / 16:19
1

Embora isso possa parecer uma solução estranha, ocasionalmente aliei rm a um script que realmente é movido para um diretório de lixo em vez de ser removido. Se você usar o caminho completo para rm, ainda poderá esvaziar essa pasta, mas ela resolveu o problema "O que você quer dizer com rm é permanente?" problema que eu recebo com uma série de linhas de comando recentes.

    
por 14.12.2011 / 20:15
0

configure um alias para que rm passe por um script personalizado seu. Ele pode verificar os argumentos de comando ( -rf * ) e imprimir um aviso desagradável "VOCÊ ESTÁ APAGANDO CERTO?" caso contrário, passará silenciosamente para /usr/bin/rm ou o que for.

    
por 13.12.2011 / 15:34
0

Isso não é tão fácil quanto parece, porque o '*' é rapidamente expandido para uma lista de arquivos / diretórios. O alias rm=rm -i alias é provavelmente a aposta mais segura.

    
por 13.12.2011 / 15:39
0

tcsh, se você set rmstar solicitará a confirmação sempre que invocar rm com um argumento * .

Claro que isso requer o uso do tcsh como seu shell interativo; Se você já estiver usando bash, provavelmente não é um bom motivo para mudar.

    
por 14.12.2011 / 05:57
0

Gigi sugeriu 'rm -i', mas ele perguntará toda vez que você quiser deletar algo.

Minha sugestão é usar o 'rm -I' - capital i - alias (alias rm = rm -I) citando a página man:

          *once before removing  more  than  three  files,  or  when
          removing  recursively.  Less intrusive than -i, while still giv‐
          ing protection against most mistakes*
    
por 14.12.2011 / 19:34
0

Minha sugestão é desativar rm com esse alias:

alias rm='echo "rm is disabled, use trash or /bin/rm instead."'

e para usar trash em vez de rm .
(O comando trash pode ser encontrado no pacote trash-cli no Debian / Ubuntu)

Se você não gostar de trash , também poderá criar um alias

alias remove='/bin/rm -irv'

e use remove em vez de rm .

    
por 26.01.2012 / 13:23
0

Não é uma resposta ideal, mas faz exatamente o que você precisa em um ambiente semelhante. De meu conhecimento, bash não suporta isso (pelo menos não através de shopt ).

zsh oferece a opção de solicitar confirmação quando vê rm usado com um asterisco (independentemente dos flags usados com esse comando).

De man zshoptions

RM_STAR_SILENT (-H) <K> <S>

Do not query the user before executing rm * or rm path/*.

RM_STAR_WAIT

If querying the user before executing rm * or rm path/*, first wait ten seconds and ignore anything typed in that time. This avoids the problem of reflexively answering yes to the query when one didn't really mean it. The wait and query can always be avoided by expanding the * in ZLE (with tab).

    
por 06.05.2017 / 01:20
-1

O problema aqui é o modo como o bash tratará o caractere * no comando. Normalmente, você poderia, por exemplo, escrever seu próprio script "rm" que filtrou sua entrada, mas neste caso o shell tratará o '*' como um pattern e expanda antes de passar os argumentos para o que você escreve.

Neste caso, sua melhor e única aposta é colocar um apelido para rm em seu .bashrc que forçará seus comandos rm:

alias rm='rm -i'
    
por 13.12.2011 / 15:43
-1

cd em um diretório vazio primeiro. rm -rf * será então inofensivo.

    
por 14.12.2011 / 17:50

Tags