4 votes

Empêchez `dd` de détruire le SSD ou le HDD

J'ai deux SSD et un disque dur.

Quand j'utilise sudo dd if=/dev/zero of=/dev/sdd count=1000 de bonnes choses arrivent et j'efface les partitions de ma clé USB.

Quand j'utilise sudo dd if=/dev/zero of=/dev/sdb count=1000 de mauvaises choses arrivent et je perds les partitions Windows 7 et Ubuntu 14.04 de mon disque dur de 500 Go.

De mauvaises choses sont arrivées une fois. Comment puis-je éviter dd de le faire à nouveau ?

ie Vérifier que of= ne contient pas sda , sdb ou sdc .

3voto

WinEunuuchs2Unix Points 91128

Créer dd enveloppe script

Ouvrez le terminal en utilisant Ctrl + Alt + T . Puis appelez gedit avec :

gksu gedit /usr/local/bin/dd

et copier et coller ces commandes :

#!/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 [[ "$2" != 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 [[ "$2" =~ "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 [[ "$2" =~ "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 [[ "$2" =~ "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

Sauvegarder le fichier et quitter gedit .

Enfin, marquez le nouveau dd comme exécutable avec :

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

A quoi cela ressemble

Voici comment cela apparaît sur l'écran de votre terminal lorsque vous avez appelé la nouvelle fonction dd script sans utiliser les lecteurs protégés.

$ 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

Notes

Parce que le wrapper script est situé dans /usr/local/bin il est appelé avant la commande régulière stockée dans /bin .

Le deuxième paramètre doit commencer par of= et ne peut pas contenir sda , sdb ou sdc En fonction de votre installation, vous pouvez ajouter des lecteurs à protéger ou en retirer.

Les caractères dessinés au trait peuvent ne pas fonctionner sur des plateformes plus anciennes ou des jeux de caractères différents. Utilisez "+---+" pour les lignes supérieures et inférieures et "|" pour les lignes centrales ou supprimez-les complètement.

log-file est un script pour enregistrer les commandes dans des fichiers d'audit. Vous pouvez le remplacer par votre propre commande et décommenter la ligne en supprimant le caractère principal # .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X