alias rm='rm --preserve-root'
IIRC --preserve-root é o padrão nas versões mais novas do coreutils.
É bem sabido que o espaço extra em env.variable pode levar à exclusão de / directory no script bash.
#!/bin/bash
...
rm -rf /$MYPATH
se $ MYPATH contiver valores como "dir" ou "dir /" , isso resultará em "rm -rf / dir" ou "rm -rf dir /" . E resultará em "rm -rf /"
Existe alguma prática recomendada para evitar essa situação?
Sempre cite seus argumentos. Mesmo quando você sabe que eles são são, quase não machuca citá-los em scripts.
rm -rf "/$FOO"
não será excluído / se $ FOO tiver um espaço inicial, em vez disso, você simplesmente não excluirá nada. Isso requer que as cotações estejam presentes na linha com rm -rf
, é claro, não algo como:
TODEL="/$FOO"
rm -rf $TODEL
Se você fizer isso , estará de volta em um monte de problemas.
Além disso, tenho a tendência de pensar um bom ol ':
if [ -d "/$FOO" ] ; then
...
fi
(ou -e
se for apenas um arquivo) é sempre uma boa ideia antes de excluir qualquer coisa.
Primeiras coisas primeiro: tenha backups. : -)
Mas enquanto eu crio esses scripts potencialmente perigosos, eu sempre primeiro faço eco das linhas perigosas, para que eu possa ver o que aconteceria.
Você também pode adicionar um arquivo chamado -i
a diretórios importantes, portanto, em algumas situações, o rm avisa ao tentar removê-los. Claro, se você fizer a exclusão através de algum outro método, como script Perl ou mesmo com parâmetros rm diferentes, isso não ajudaria.
Também é possível definir o sinalizador imutável para arquivos e diretórios importantes com chattr +i
, mas tenha cuidado com isso. Isso pode te morder se você realmente deve remover arquivos de algum diretório ou modificar os arquivos ...
Uma maneira de evitar o problema seria usar um sistema operacional que impeça que um comando desse tipo seja bem-sucedido, já que é possível que ele não seja compatível com POSIX. Foi iniciado pelo Solaris 10 (2005), seguido pelo BSD e depois pelo Gnu rm em 2006.
Verifique seu código primeiro. Sério, qualquer coisa que alguém disser será apenas algo equivalente ao cheque que você deveria ter feito dentro do seu código para checar o valor de $ MYPATH. Se o script estiver sendo executado interativamente, você poderá remover o -f.
Você pode cortar a variável MYPATH
antes de executar o comando rm. Apenas use echo:
MYPATH='echo $MYPATH'
Após um incidente embaraçoso há muitos anos em uma caixa Ultrix, onde fiz como root um userdel -r sccs
(ou equivalente em Ultrix, há muito tempo) sem verificar o diretório inicial do usuário sccs e o usuário sccs $ HOME acabou sendo /, e o sistema de arquivos foi embora, evitei colocar rm -rf $ANYTHING
em scripts. Você pode verificar a variável até ficar com o rosto azul, mas eu prefiro imprimir uma mensagem como "se você está feliz com a ideia, você deve executar sudo rm -rf $ANYTHING
".
Você poderia passar MYPATH através do sed e verificar se o que você colocou é o mesmo que você sai
MYPATH1='echo "$MYPATH" | sed -e 's|[ \t]\/[ \t]| |' -e 's|^/[ \t]| |' -e 's|[ \t]/$| |' '
if [ "$MYPATH" != "$MYPATH1" ]
then
dosomething
fi
Você está fazendo uma coisa muito engraçada aqui, pegando o que parece ser um caminho relativo e transformando-o em um caminho absoluto. Tratar o caminho dado como o caminho dado é um bom começo para realizar o que você quer, mas tome o conselho de outros comentaristas e cite tudo.