Предотвращение dd управляет на дополнительных дисках

Я использую dd много повседневно для записи изображений SD-карты Raspberry Pi.

Однако время от времени я скольжу и случайно dd неправильный раздел и таким образом уничтожение моих других дисков.

Я задавался вопросом, был ли способ смочь к использованию записи блока dd сказать /dev/sdb и /dev/sdc.

1
задан 22 August 2015 в 22:33

2 ответа

Это - Linux, таким образом, это легко. Ввести echo $PATH и найдите каталог, который 1) у Вас есть доступ для записи; и 2) это находится ранее в списке, чем каталог, от которого Вы добираетесь type -p dd. Поместите этот файл в тот каталог, названный dd, и сделайте это исполняемым файлом через chmod +x.

Вот файл:

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

Когда Вы протестировали его достаточно, изменение debugmode=1 кому: debugmode=0.

Вот мои тесты:

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

Не забудьте изменять тест на тест, который Вы хотите.

Благодаря @muru для [[и случай

3
ответ дан 3 December 2019 в 06:41

Несомненно, Вы могли записать сценарий обертки, чтобы препятствовать тому, чтобы себя сделали ошибки, но иметь такое ложное чувство установленной защищенности, Вы собираетесь иметь опасное поведение в других системах, потому что Вы привыкли к уровню комфорта, который только существует в Вашей системе.

Поэтому мой ответ:

Думают перед корнем и не, нет никакого пути к блок другие устройства. Когда блочное устройство доступно для корня, затем dd может также получить доступ к нему. dd делает только, что Вы говорите этому делать.

dd также известен как Disk Destroyer ;-)

2
ответ дан 3 December 2019 в 06:41

Другие вопросы по тегам:

Похожие вопросы: