Evitando o comando dd em unidades extras

1

Eu uso dia a dia dd para escrever imagens de cartões Raspberry Pi SD.

No entanto, de vez em quando eu escorrego e por acidente dd da partição errada e, assim, mato meus outros drives.

Eu queria saber se havia uma maneira de bloquear a gravação usando dd para dizer /dev/sdb e /dev/sdc .

    
por Ryan Walmsley 22.08.2015 / 21:17

2 respostas

3

Este é o Linux, então é fácil. Digite echo $PATH e encontre um diretório que 1) você tenha acesso de gravação; e 2) é mais antigo na lista do que o diretório obtido de type -p dd . Coloque esse arquivo nesse diretório, chamado dd , e torne-o executável via chmod +x .

Aqui está o arquivo:

----------------------------- cut here ---------------------------
#!/bin/bash
# try to prevent foot-shooting via dd - complain if if= or of= is mounted
debugmode=1
#
# either abort with a message or pass everything to the real dd
realdd="/usr/bin/dd"
if [ $debugmode = 1 ] ; then
    realdd="/bin/echo"
fi
if [ ! -x "$realdd" ] ; then
    echo "$0 cannot find the real dd at $realdd" >&2
    exit 255
fi

errors=0

function diskok () {
    # passed a parameter, if=... or of=... 
    # if the argument to if= or of= is "WRONG", pull the plug
    param=$1;
    device="${param##?f=}"

# replace this with checks of your choice. I'm simply excluding any word in /etc/fstab 

    if [[ $( grep -q "$device" /etc/fstab;echo $? ) = 0 ]]; then
    echo "Trying to dd a mounted device $param" >&2
    (( errors++ ))
    fi
}

laundry=""

# Re: Those tests for if and of. You can just do if [[ $1 = if=* ]] and if [[ $1 = of=* ]]. Or, better yet, use a case statement. –  muru 7 mins ago
while [[ $# -gt 0 ]] ; do
    case "$1" in
    if=*)
            diskok "$1" ;;
    of=*)
            diskok "$1" ;;
    esac
    laundry="$laundry $1"
    shift
done
if [ 0 -eq $errors ] ; then
    eval "$realdd $laundry"
else
    echo "Saved"
fi
----------------------------- cut here ---------------------------

Quando você tiver testado suficientemente, altere debugmode=1 para debugmode=0 .

Aqui estão meus testes:

w3@aardvark:~(254)$ df
Filesystem        1K-blocks      Used Available Use% Mounted on
/dev/sda5         170416096  29962928 131773488  19% /
none                      4         0         4   0% /sys/fs/cgroup
udev                1938252        12   1938240   1% /dev
tmpfs                390632      1104    389528   1% /run
none                   5120         0      5120   0% /run/lock
none                1953148       444   1952704   1% /run/shm
none                 102400        24    102376   1% /run/user
/dev/sda6         302248384 247234972  39637036  87% /home
/home/w3/.Private 302248384 247234972  39637036  87% /home/w3
/dev/sdb            3840544   1229408   2611136  33% /home/w3/mnt/CLIPZIP
w3@aardvark:~(0)$ dd bs=8293 if=/dev/sda of=/dev/sda5 of=/home
Trying to dd a mounted device if=/dev/sda
Trying to dd a mounted device of=/dev/sda5
Trying to dd a mounted device of=/home
Saved
w3@aardvark:~(254)$ dd bs=8293 if=/dev/sdaa of=/dev/sdaa5 of=/homae
bs=8293 if=/dev/sdaa of=/dev/sdaa5 of=/homae

Lembre-se de alterar o teste para o teste que você deseja.

Obrigado a @muru por [[e case

    
por waltinator 22.08.2015 / 23:24
2

Claro, você pode escrever um script wrapper para evitar erros, mas tendo uma falsa sensação de segurança estabelecida, você terá um comportamento arriscado em outros sistemas, porque você está acostumado a um nível de conforto que só existe no seu sistema.

Portanto, minha resposta é:

Pense antes de root e não, não há como bloquear outros dispositivos. Quando o dispositivo de bloco está acessível para root, o dd também pode acessá-lo. dd faz apenas o que você diz para fazer.

dd também é conhecido como D isk D estroyer ; -)

    
por A.B. 22.08.2015 / 21:32