Práticas recomendadas para alias o comando rm e torná-lo mais seguro

21

Algum tempo atrás, eu excluí erroneamente minha pasta pessoal porque eu executei um rm -rf *no terminal errado, cujo diretório de trabalho era a pasta pessoal!

Eu gostaria de ter um apelido para o rmcomando, mas não foi o caso.

Agora, estou planejando criar um script como um apelido para rm.

Você tem alguma prática recomendada a sugerir?

Obrigado.

Vincenzo Pii
fonte
7
Não que eu não tenha simpatia, mas não acho que rmseja um comando perigoso que exija um apelido de segurança. Ao utilizar o re fopções, você está dizendo a shell Sei que é perigoso, e eu pensei cuidadosamente sobre isso, e é _really_ o que eu quero fazer . Se você não usar essas opções, não poderá excluir toda a sua pasta pessoal.
usar o seguinte comando
Esta pergunta cobre as mesmas informações que stackoverflow.com/questions/373156/… ?
David Harris
1
@grossvogel nenhuma ofensa tomada :)! No entanto, alias esse comando é uma prática comum. Muitas pessoas usam a opção -f para evitar a confirmação de cada exclusão.
23
Observe que se você usar um alias para rmse acostumar com esse alias. Então, um dia, você estará em um sistema em que o alias não existe e fará a coisa errada quando menos esperar. E provavelmente não será o seu sistema.
Stefan Lasiewski
2
@ Puller Apenas em sistemas como o RHEL que estupidamente apelidam rmde rm -i.
Daniel Beck

Respostas:

30

Se você quiser um personalizado rm, não chamá-lo rm, mas um nome de vocês, myrm, deleteou o que quer.

O rm='rm -i'alias é um horror, porque após um tempo de uso, você esperará rmsolicitar por padrão antes de remover os arquivos. Obviamente, um dia você o administrará com uma conta que não tenha esse alias definido e, antes de entender o que está acontecendo, será tarde demais.

De qualquer forma, uma boa maneira de estar preparado para perda ou corrupção de arquivos é fazer backups.

Uma alternativa rápida que o protegerá contra exclusão ou substituição acidental de arquivos está usando um sistema de arquivos que suporta instantâneos ilimitados como o ZFS. Se instantâneos frequentes forem feitos automaticamente, você poderá recuperar os arquivos no estado em que estavam durante o último instantâneo antes do incidente.  

jlliagre
fonte
3
Eu ouvi essa história de horror pessoalmente de alguém que a sofreu.
Dan D.
Eu concordo, mas a maioria das pessoas não tem liberdade para mudar para um sistema de arquivos completamente diferente.
Peon
De fato, essa é a razão pela qual sugiro fazer backups, um recurso que nenhum sistema de arquivos proíbe.
Jlliagre
12

Se você deseja salvar aliases, mas não quer se arriscar a se acostumar com os comandos que funcionam de maneira diferente no seu sistema do que em outros, desabilite rmassim

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

Então você pode criar seu próprio apelido seguro, por exemplo

alias remove='/bin/rm -irv'

ou use trash.

Dario Seidl
fonte
2
Observe que (pelo menos em algumas versões) você deve definir os aliases na outra ordem. Fazê-lo na ordem que você apresenta define removecomo echo "rm is disabled, use trash or /bin/rm instead." -irv. E, apenas por uma questão de bom senso, você não gostaria que a mensagem rmse referisse ao seu removecomando seguro ?
213 Scott Scott
Você está certo, eu atualizarei a resposta de acordo.
Dario Seidl
5

Você pode tentar usar trash. Lembre-se de esvaziá-lo de vez em quando ...

l0b0
fonte
3

Sem precisar alterar o perfil de todos, o que você pode fazer é colocar o arquivo chamado -i no diretório

# touch -- -i
# ll
total 0
-rw-r--r-- 1 root users  0 Jan 26 19:24 files
drwxr-xr-x 2 root users 40 Jan 26 19:24 folder_of_power
-rw-r--r-- 1 root root   0 Jan 26 19:25 -i
-rw-r--r-- 1 root users  0 Jan 26 19:24 important
-rw-r--r-- 1 root users  0 Jan 26 19:24 very
# rm -rf *
rm: remove regular empty file `files'? 
DarkHeart
fonte
Não funcionará se o usuário decidir usar *. * em vez de apenas *. Mas ainda é um truque legal.
Peon
1
afaik rm -rf. nem rm -rf .. não pode ser bem-sucedido porque você está atualmente no diretório
Peon
@ Peon: Eu acredito que você quer dizer .* *, e não * .*(o que eu acredito ser mais comum) ou * . *(o que você disse). …………………………………………………………………… Para que esta técnica seja verdadeiramente efetiva globalmente, você precisaria fazê-lo em todos os diretórios nos quais tenha permissão de gravação . Mas eu concordo, é um truque legal.
213 Scott Scott
1

Eu uso o seguinte script.

#!/bin/sh

trash=$HOME/tmp
mv "$@" $trash
nohup find "$trash" -type f -atime +7 -exec /bin/rm '{}' \; 2>&1 &

Se você excluir um arquivo acidentalmente, recupere-o no $HOME/tmp.

O script move os arquivos excluídos para um tmpdiretório e os exclui da próxima vez que o script de exclusão for executado, se o tempo de acesso for 7 dias depois (limpeza semiautomática do $HOME/tmpdiretório).

user580224
fonte
-2

No seu perfil,

alias rm="rm -i"

fonte
3
Aliasing rm é, na minha opinião, um péssimo conselho e, de qualquer forma, não ajudará no caso do extrator.
Jlliagre
rm -Idá o melhor dos dois mundos, @jlliagre.
Tamara Wijsman
@ Tom Wijsman, parcialmente mesmo. Mudar o comportamento de um comando Unix padrão crítico ainda é um risco potencial aqui. Se você quiser que ele seja interativo, atribua um nome diferente ao alias.
jlliagre
@jlliagre: Hmm, você quer dizer que os scripts captam essa alteração?
Tamara Wijsman
Por favor, leia minha resposta superuser.com/a/382498/19279 para entender meu ponto.
Jlliagre
-2

Um script chamado d, com conteúdo mv $* /tmp.

edit: Esta é uma má ideia; ver abaixo. Atualmente, tenho alias d='mv -t /tmp'no meu .profilelugar.

beefus
fonte
2
Essa sugestão é perigosa e pode a) substituir arquivos já lixeira com o mesmo nome ou b) excluir os arquivos completamente errados ( d "foo bar"excluirá os arquivos fooe bar). Algo mais seguro é provavelmente #!/bin/bash TRASH="$( mktemp -d -t trashed.XXX )"; echo "Moving to trash $TRASH"; mv -v -- "$@" "$TRASH"( mktempe a mvsintaxe depende do seu sistema, este funciona para Linux).
Daniel Beck
2
Obrigada pelo esclarecimento. Estou bem com a questão a), mas a questão b) é um grande problema. Eu mudei meu dcomando para alias d='mv -t /tmp'no meu .profile; Eu acho que é a solução simples que eu estava procurando.
beefus 23/07
-2

Este código bash adiciona a função rmao seu ~/.bash_profilearquivo de configuração. Depois de executar isso, se você escrever rm file, você moverá esse arquivo para/tmp

cat << EOF >> ~/.bash_profile
rm () {
  mv $1 /tmp
}
EOF
Vicente Gonzalez
fonte
1
O que esse script / código faz? Explique para que usuários menos técnicos possam entender sua resposta.
Vylix 3/17/17
2
Embora isso possa responder à pergunta, seria uma resposta melhor se você pudesse fornecer alguma explicação para isso.
DavidPostill
1
Isso fornece uma resposta para a pergunta, mas é muito ruim. Duas versões melhores desta resposta já foram publicadas.
Scott
Este código bash adiciona a função rmao seu ~/.bash_profilearquivo de configuração. Depois de executar este arquivo, se você escrever rm file, você moverá esse arquivo para o /tmp.
Vicente Gonzalez
Obrigado por explicar. Você poderia editar sua resposta para incluí-la na própria postagem?
Ben N