Como evitar que o script seja excluído

3

Oi eu estou criando um script de lixeira com o nome do comando 'safe_rm'. Fiquei me perguntando, como posso evitar que o script exclua seu próprio arquivo. Eu acredito que o comando readlink é uma solução, mas não sei como escrevê-lo dentro do script.

Aqui está o meu código atual

while [ $# -ne 0 ]
   do

    if [ ! -e "$1" ] ; then
            echo "File not found."
    elif [ -d "$1" ] ; then
            echo "Error. You have entered a directory."
    elif [ $1 = $(readlink -e ~/project/safe_rm) ] ;
            echo "Attempting to delete safe_rm - operation aborted"
            exit 0

    else
    inode=' ls -i $1 | cut -d" " -f1 '
    echo $1_$inode:$(readlink -e $1) >> /home/j.t/.restore.info
    mv $1 /home/j.t/deleted/$1_$inode

    echo "File '$1' has been moved to the recycle bin."
    fi

shift
done

O código que precisa ser modificado está na linha 8.

    
por jthomp 02.05.2016 / 15:43

3 respostas

1

Você está apenas a um passo de uma solução de trabalho. Canonize a variável e pronto:

elif [ "$(readlink -e "$1")" = "$(readlink -e ~/project/safe_rm)" ] ;

Eu coloco tudo em aspas porque os caminhos podem conter espaços. Note que você não precisa escapar das aspas dentro da subshell ( $(…) thingy). Obrigado a @glenn jackman por essa correção.

    
por 02.05.2016 / 21:12
1

Se você estiver usando readlink -e , isso pressupõe os utilitários básicos do GNU. Mas usar ls para obter o valor de inode é indireto. Usando stat (também do mesmo pacote coreutils), você pode obter o valor de inode diretamente. Se você limitar a comparação a inodes, também poderá impedir que links simbólicos que você tenha configurado aponte para o script ser removido.

Aqui está um exemplo:

#!/bin/sh
mynode=$(stat --printf='%i' $(readlink -e "$0"))
while [ $# -ne 0 ]
   do
    if [ ! -e "$1" ] ; then
            echo "File not found."
    elif [ -d "$1" ] ; then
            echo "Error. You have entered a directory."
    else
        itnode=$(stat --printf='%i' "$1")
        if [ $mynode = $itnode ] ; then
            echo "Attempting to delete $0 - operation aborted"
            exit 0
        fi    

        echo "$1_$itnode:$(readlink -e "$1")" >> /home/j.t/.restore.info
        mv "$1" "/home/j.t/deleted/$1_$itnode"

        echo "File '$1' has been moved to the recycle bin."
    fi

    shift
done
    
por 03.05.2016 / 13:39
0

O chattr pode inibir qualquer pessoa, exceto o root, de poder excluir um arquivo, mesmo um arquivo armazenado na lixeira.

Como root

chattr +i /path/to/safe_rm
    
por 03.05.2016 / 14:28