防止在额外驱动器上运行 dd 命令

防止在额外驱动器上运行 dd 命令

dd每天都会用很多东西来写入 Raspberry Pi SD 卡图像。

然而,我时不时会失误并意外地进入dd错误的分区,从而损坏我的其他驱动器。

我想知道是否有办法能够使用dd/dev/sdb和来阻止书写/dev/sdc

答案1

这是 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=1debugmode=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 的[[和案例

答案2

当然,您可以编写一个包装脚本来防止自己犯错误,但是建立了这样一种虚假的安全感后,您将在其他系统上做出危险的行为,因为您已经习惯了只存在于您的系统中的舒适度。

因此我的答案是:

先想再说,没有办法堵塞其他设备。当块设备可供 root 访问时,dd也可以访问它。dd只执行您告诉它执行的操作。

dd也被称为冰岛克朗埃斯特罗耶尔;-)

相关内容