Impedir que 'dd' destrua SSD ou HDD

1

Eu tenho dois SSDs e no HDD.

Quando uso sudo dd if=/dev/zero of=/dev/sdd count=1000 coisas boas acontecem e apago partições do meu pen drive USB.

Quando uso sudo dd if=/dev/zero of=/dev/sdb count=1000 coisas ruins acontecem e perco as partições do Windows 7 e Ubuntu 14.04 do meu Disco Rígido de 500 GB.

Coisas ruins aconteceram uma vez. Como posso evitar que dd faça isso de novo?

ie Verifique se of= não contém sda , sdb ou sdc .

    
por WinEunuuchs2Unix 04.01.2017 / 04:17

1 resposta

2

Criar dd script de wrapper

Abra o terminal usando Ctrl + Alt + T . Em seguida, chame gedit com:

gksu gedit /usr/local/bin/dd

e copie e cole estes comandos:

#!/bin/bash

# Who called this script?
PARENT_COMMAND="$(ps -o comm= $PPID)"   
if [[ $(id -u) != 0 ]]; then # Only non-root processes enter password (ie "sudo dd ..." is ok)
    echo dd must be called with sudo powers
    exit 1
fi

# log dd usage for audit trails
# log-file '"$PARENT_COMMAND"" - ""$@"' "/var/log/dd-usage"

# Display hints & arguments. Get any key to proceed or <Ctrl>+C to abort
echo "╔════════════════════════════════════════════════════════════════╗"
echo "║                                                                ║"
echo "║                      dd - Data Duplicator                      ║"
echo "║                                                                ║"
echo "╚════════════════════════════════════════════════════════════════╝"
echo
echo " Parameter 1 hint: if=/dev/zero"
echo " Parameter 2 hint: of=/dev/sdY where Y cannot be a, b or c"
echo " Parms >2 hints:   bs=512 is default block size"
echo " Parms >2 hints:   count=100 will process 100 blocks"
echo
echo " Use /bin/dd --help for more info (don't use dd --help)"
echo
# Display drive letterss, names and sizes without partitions for guide
lsblk -ido KNAME,TYPE,SIZE,MODEL
echo
echo " Current parameters: "”$@”
echo
echo "      Press <Enter> to continue or <Ctrl>+C to abort."

read ANYKEY

if [[ "" != of=* ]]; then
    echo -e "\a" # PC speaker beep or pleasant bell with PulseAudio hooks
    echo "ERROR! Parameter 2 must start with 'of=' (output file=)"
    exit 2
fi

if [[ "" =~ "sda" ]]; then
    echo -e "\a" # PC speaker beep or pleasant bell with PulseAudio hooks
    echo "ERROR! Output file (of=) cannot be /dev/sda"
    exit 2
fi

if [[ "" =~ "sdb" ]]; then
    echo -e "\a" # PC speaker beep or pleasant bell with PulseAudio hooks
    echo "ERROR! Output file (of=) cannot be /dev/sdb"
    exit 2
fi

if [[ "" =~ "sdc" ]]; then
    echo -e "\a" # PC speaker beep or pleasant bell with PulseAudio hooks
    echo "ERROR! Output file (of=) cannot be /dev/sdc"
    exit 2
fi  

# Call REAL dd command with parameters passed to this wrapper sript
/bin/dd "$@"

exit 0

Salve o arquivo e saia do gedit .

Por fim, marque o novo dd como executável com:

sudo chmod +x /usr/local/bin/dd

O que parece

Abaixo está como ele aparece na tela do seu terminal quando você chama o novo script dd sem usar as unidades protegidas.

$ sudo dd if=/dev/zero of=/dev/sdd bs=512 count=100
╔════════════════════════════════════════════════════════════════╗
║                                                                ║
║                       dd - Data Duplicator                     ║
║                                                                ║
╚════════════════════════════════════════════════════════════════╝

 Parameter 1 hint: if=/dev/zero
 Parameter 2 hint: of=/dev/sdY where Y cannot be a, b or c
 Parms >2 hints:   bs=512 is default block size
 Parms >2 hints:   count=100 will process 100 blocks

 Use /bin/dd --help for more info (don't use dd --help)

KNAME TYPE   SIZE MODEL
sda   disk 223.6G KINGSTON SHSS37A
sdb   disk 465.8G ST9500423AS     
sdc   disk 119.2G KingFast        
sdd   disk  29.8G USB Flash Drive 
sr0   rom   1024M DVD+-RW GT80N   

 Current parameters: 'if=/dev/zero of=/dev/sdd bs=512 count=100'

      Press <Enter> to continue or <Ctrl>+C to abort.

100+0 records in
100+0 records out
51200 bytes (51 kB, 50 KiB) copied, 0.00339331 s, 15.1 MB/s

Notas

Como o script do wrapper está localizado em /usr/local/bin , ele é chamado antes do comando normal armazenado em /bin .

O segundo parâmetro deve começar com of= e não pode conter sda , sdb ou sdc , adicionar mais unidades para proteger ou subtrair unidades dependendo da sua instalação.

Os caracteres de desenho de linha podem não funcionar em plataformas mais antigas ou conjuntos de caracteres diferentes. Use "+ --- +" para as linhas superior e inferior e "|" para linhas do meio ou removê-los completamente.

log-file é um script para registrar comandos para auditar arquivos. Você pode substituí-lo com seu próprio comando e cancelar o comentário da linha removendo o primeiro # .

    
por WinEunuuchs2Unix 04.01.2017 / 04:17