Práticas recomendadas para evitar 'rm -rf /' em scripts bash

6

É 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?

    
por igorp1024 09.11.2010 / 12:05

9 respostas

12
alias rm='rm --preserve-root'

IIRC --preserve-root é o padrão nas versões mais novas do coreutils.

    
por 09.11.2010 / 12:53
7

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.

    
por 09.11.2010 / 13:24
2

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 ...

    
por 09.11.2010 / 12:11
2

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.

    
por 09.11.2010 / 13:04
1

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.

    
por 09.11.2010 / 12:09
1

Você pode cortar a variável MYPATH antes de executar o comando rm. Apenas use echo:

MYPATH='echo $MYPATH'
    
por 09.11.2010 / 12:11
1

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 ".

    
por 09.11.2010 / 12:12
1

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
    
por 09.11.2010 / 15:06
0

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.

    
por 09.11.2010 / 15:09

Tags