我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=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 的[[和案例
答案2
当然,您可以编写一个包装脚本来防止自己犯错误,但是建立了这样一种虚假的安全感后,您将在其他系统上做出危险的行为,因为您已经习惯了只存在于您的系统中的舒适度。
因此我的答案是:
先想再说,没有办法堵塞其他设备。当块设备可供 root 访问时,dd
也可以访问它。dd
只执行您告诉它执行的操作。