Frage Verhindern Sie, dass `dd` SSD oder HDD zerstört


Ich habe zwei SSDs und auf HDD.

Wenn ich benutze sudo dd if=/dev/zero of=/dev/sdd count=1000 Gute Dinge passieren und ich lösche Partitionen von meinem USB-Stick.

Wenn ich benutze sudo dd if=/dev/zero of=/dev/sdb count=1000 Schlimme Dinge passieren und ich löse Windows 7 und Ubuntu 14.04 Partitionen von meiner 500 GB Festplatte.

Schlimme Dinge sind einmal passiert. Wie kann ich verhindern? dd es wieder zu tun?

Dh überprüfe das of= enthält nicht sda, sdb oder sdc.


1
2018-01-04 03:17


Ursprung


Ich habe auf vielen Systemen gesehen, darunter zwei von mir, wo ich einen SATA-Port übersprungen habe. Dann, wenn ich SDF-Flash-Laufwerk einstecken, ist es SDF, aber beim Neustart wird es SDB und jedes andere Laufwerk ändert sich. Einige haben Flash auch zu sda befördert. Wenn Sie also ein Gerät zum Mounten oder Editieren eines Laufwerks verwenden, müssen Sie es immer zuerst mit parted, fdisk oder gdisk überprüfen. - oldfred
@oldfred Nun, das ist beängstigend ... A lsblk sollte immer ausgeführt werden, um die Laufwerke zu bestätigen. Oder die perfekte Antwort sollte UUID's bestätigen sda, sdb und sdc und klagen wenn anders. - WinEunuuchs2Unix
Die kurze Antwort ist sehr sehr vorsichtig beim Aufruf dd. Es spielt keine Rolle, ob Sie ein Wrapper-Skript dafür erstellen. Sie müssen immer noch genau wissen, was Sie tun, bevor Sie den Befehl ausführen. - wjandrea
Das Problem ist nicht, nicht zu wissen dd das Problem ist versehentlich zu sagen sdb Anstatt von sdd. - WinEunuuchs2Unix
@oldfred Basierend auf Ihrem Kommentar, habe ich die Antwort verbessert, indem ich eine Anzeige von Laufwerksbuchstaben, Namen und Größen innerhalb der dd Wrapper-Skript unten. Vielen Dank für Ihre Anmerkungen zum Ändern der Laufwerksbuchstaben. - WinEunuuchs2Unix


Antworten:


Erstellen dd Wrapper-Skript

Öffnen Sie das Terminal mit Strg+Alt+T. Dann ruf an gedit mit:

gksu gedit /usr/local/bin/dd

und kopieren und fügen Sie diese Befehle ein:

#!/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

Speichern Sie die Datei und beenden Sie sie gedit.

Zuletzt markieren Sie das neue dd als ausführbar mit:

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

Wie es aussieht

Unten ist, wie es auf Ihrem Terminalbildschirm erscheint, wenn Sie das neue aufgerufen haben dd Skript ohne die geschützten Laufwerke zu verwenden.

$ 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

Anmerkungen

Da sich das Wrapper-Skript in befindet /usr/local/bin Es wird vor dem regulären Befehl in gespeichert /bin.

Der zweite Parameter muss mit beginnen of= und kann nicht enthalten sda, sdb oder sdc, fügen Sie weitere Laufwerke hinzu, um Laufwerke abhängig von Ihrer Installation zu schützen oder zu subtrahieren.

Line Draw-Zeichen funktionieren möglicherweise nicht auf älteren Plattformen oder anderen Zeichensätzen. Verwenden Sie "+ --- +" für die obere und untere Zeile und "|" für mittlere Linien oder entfernen Sie sie ganz.

log-file ist ein Skript zum Protokollieren von Befehlen zum Prüfen von Dateien. Sie können es durch Ihren eigenen Befehl ersetzen und die Zeile rückgängig machen, indem Sie die führende Zeile entfernen #.


2
2018-01-04 03:17



Empfehlen Sie das Skript als /usr/local/sbin/dd oder /usr/local/bin/dd. Sie kommen früher im üblichen PATH als /bin, so wird entweder statt laufen /bin/dd, und sie werden nicht überschrieben, wenn die coreutils Paket kommt mit einem neuen dd binär während einiger Zukunft apt upgrade. Plus Dinge wie debsums werde mich nicht beschweren. - Chai T. Rex
@ ChaiT.Rex Es gibt ein Problem mit dem Umzug /usr/local/bin weil die Berechtigungen: drwxr-xr-x 5 sind anders als /binwas hat drwxr-xr-x 2 und es sei denn, du wurdest zu sudo erhöht /bin Version wird automatisch ausgeführt. - WinEunuuchs2Unix
Das passiert hier nicht. Mit oder ohne sudo, /usr/local/bin/dd läuft. Diese Berechtigungen sehen identisch aus (die Nummer danach drwxr-xr-x ist die Anzahl der Hardlinks zu diesem Verzeichniseintrag, es ist kein Teil der Berechtigungen). Ein Problem könnte sein, wenn Sie ein Terminal verwenden, das vor der Erstellung gestartet wurde /usr/local/bin/dd oder setzen Sie es ausführbar, es könnte zwischengespeichert haben dd wie in /bin. Wenn das der Fall ist, sollte das Schließen des Terminals und das erneute Öffnen es beheben. - Chai T. Rex
@ ChaiT.Rex Du bist richtig. Mein Terminalfenster war durch Versuche des Anrufens verdorben sudo -s gefolgt von exit in Testskripten, um zu sehen, ob das Passwort verifiziert werden konnte und zu den Befugnissen des Benutzers zurückkehren kann. Das Öffnen eines neuen Fensters hat das Verhalten auf normal zurückgestellt. Entschuldigung für Unannehmlichkeiten. - WinEunuuchs2Unix
Ich habe gerade einen Artikel gelesen, der mir gestern Alias ​​empfohlen hat .bashrc zum rm = rm -i. - WinEunuuchs2Unix