Übergeben von dd skip | seek offset als hexadezimal

11
# dd if=2013-Aug-uptime.csv bs=1 count=1 skip=3 2> /dev/null
d
# dd if=2013-Aug-uptime.csv bs=1 count=1 skip=0x3 2> /dev/null
f

Warum gibt der zweite Befehl einen anderen Wert aus?

Ist es möglich, den Offset "Überspringen | Suchen" ddals Hexadezimalwert zu übergeben?

eadmaster
quelle

Antworten:

18

Warum gibt der zweite Befehl einen anderen Wert aus?

Wird aus historischen Gründen ddals xMultiplikationsoperator betrachtet. Wird 0x3also mit 0 bewertet.

Ist es möglich, den Offset "Überspringen | Suchen" als Hexadezimalwert an dd zu übergeben?

Soweit ich weiß nicht direkt. Neben der Multiplikation mit dem Operator xkönnen Sie eine beliebige Zahl mit bdem Zusatz "Multiplizieren mit 512" (0x200) und mit K"Multiplizieren mit 1024" (0x400) versehen. Mit GNU dd können Sie auch Suffixe verwenden M, G, T, P, E, Zund Ydurch 2 hoch 20 multiplizieren bedeuten, 30, 40, 50, 60, 70, 80 oder 90 sind, und man kann obere oder Kleinbuchstaben verwenden , außer für das bSuffix. (Es gibt viele andere mögliche Suffixe. Bedeutet beispielsweise EB"Multiplizieren mit 10 18 " und PiB"Multiplizieren mit 2 50 ". info coreutils "block size"Weitere Informationen finden Sie, wenn Sie eine GNU-Installation haben.)

Vielleicht finden Sie das oben Genannte arkan, anachronistisch und geekig bis zur Absurdität. Keine Sorge: Sie sind nicht allein. Glücklicherweise können Sie einfach alles ignorieren und stattdessen die arithmetische Substitution Ihrer Shell verwenden (Bash- und andere Posix-kompatible Shells funktionieren ebenso wie einige Nicht-Posix-Shells). Die Shell versteht Hexadezimalzahlen und ermöglicht eine ganze Reihe von arithmetischen Operatoren, die auf normale Weise geschrieben wurden. Sie müssen den Ausdruck nur umgeben mit $((...)):

# dd if=2013-Aug-uptime.csv bs=1 count=$((0x2B * 1024)) skip=$((0x37))
Rici
quelle
Beachten Sie, dass $((...))es sich um eine arithmetische POSIX-Erweiterung handelt. Sie ist überhaupt nicht bash-spezifisch. Sie müssen sie nicht verwenden bash, um sie zu verwenden. Jede POSIX-Shell reicht aus. Beachten Sie jedoch, dass in vielen Shells, einschließlich bash, eine Wortaufteilung durchgeführt wird, daher sollte zitiert werden.
Stéphane Chazelas
@StephaneChazelas: Das stimmt, es ist nicht bash-spezifisch. Es werden jedoch keine Anführungszeichen benötigt. (Posix: "Der Ausdruck wird so behandelt, als ob er in doppelten Anführungszeichen steht, außer dass ein doppeltes Anführungszeichen innerhalb des Ausdrucks nicht speziell behandelt wird.") Wenn der Ausdruck eine Variable enthält und sein Wert ein Trennzeichen enthält, dann wäre es keine gültige Nummer; Das Setzen von Anführungszeichen $((...))ändert nichts. Der einzige Fall, in dem ich mir vorstellen kann, wo Zitate irgendetwas IFS=4bewirken würden, wäre, wenn Sie so etwas hätten, aber das würde alle möglichen anderen Chaos verursachen.
Rici
In dem von Ihnen zitierten Abschnitt geht es darum, was sich darin befindet $((...)). POSIX ist klar, dass die Erweiterung von der Wortaufteilung $((...))unterliegt . Der Operator split + glob lässt keine der Erweiterungen für Befehle / Arithmetik / Variablen im Listenkontext ohne Anführungszeichen. Das Setzen von IFS = 4 würde nicht alle möglichen Probleme verursachen, wenn Sie den Split + Glob-Operator nicht dort verwenden, wo er nicht benötigt / gewünscht wird, und IFS jedes Mal setzen, wenn Sie diesen Split + Glob-Operator benötigen.
Stéphane Chazelas
@StephaneChazelas: Ja, das numerische Ergebnis unterliegt einer Wortaufteilung. Aber es ist eine ganze Zahl. Wenn Sie IFSetwas einstellen , das Ziffern enthält, etwas, von dem ich nicht glaube, dass ich es jemals getan habe, müssen Sie zitieren. Wenn man das tun würde, wäre man sich vermutlich der Notwendigkeit bewusst, da es kaum etwas ist, was man wahrscheinlich beiläufig tun wird. Zumindest ist es kaum etwas, was ich wahrscheinlich tun werde, Punkt. Ich will nicht für dich sprechen.
Rici
1
@ogurets: Welche Shell benutzt du? (Bitte Version beifügen).
Rici
0

Ich weiß, dass dies ein alter Thread ist, aber das Problem ist immer noch so aktuell wie immer, besonders wenn Idioten wie ich versehentlich eine 'cp fileA fileB' aus dem Bash-Verlauf abrufen und auslösen, wenn fileB noch nicht eingecheckt ist, um nicht gesichert zu werden nach oben und enthält mehrere Stunden Codierung nach einer Nacht: - /

Dank der Konzepte in diesem Thread konnte ich meine verlorene Datei vollständig wiederherstellen, verlor jedoch meine auf einem virtuellen Virtual Private-Server mit einer 32-GB-Festplatte und sehr wenig RAM (unter Ubuntu 18.04) und alle meine Versuche mit 'grep' as oben würde schnell mit "unzureichendem Speicher" sterben

In meinem Fall war es das, hexdump -C /dev/sdX1 | grep 'shortString'was mir zu Hilfe kam. Im Gegensatz zu grep wird nur eine sehr knappe ASCII-Darstellung des Hex angezeigt. Daher ist es wichtig, nur nach einer kurzen, eindeutigen Zeichenfolge zu suchen und zu berücksichtigen, dass auch diese umbrochen werden kann. Nachdem es eine Hex-Adresse ausgegeben hatte, bei der eine Übereinstimmung bestand, konnte ich 'dd' auf ähnliche Weise wie oben verwenden, außer dass ich feststellte, dass es standardmäßig eine Blockgröße von 4096 hatte, also musste ich nicht nur konvertieren sie die hex - Adresse in dezimalem Bytes aber teilen sie durch 4096 es zu 4k Blöcken für DDs Parameter skip maßstab - wenig hilfreich, wenn diese Zahl für dd der Fehlermeldung sieht zu groß ist , wie es etwa beschwert skip=eher ungültig ist als die Anzahl an sie übergab .

$((0xabcd))Ein großes Lob an die Leute, die Tipps zur Verwendung von Bash hinzugefügt haben, um die Hex-> Dec-Konvertierung zu vereinfachen :-)

Nur mein letztes Wort - In meinem Fall gab es mehrere Kopien derselben Datei, die sich alle in unmittelbarer Nähe befanden. Aber indem ich die niedrigste Adresse von der höchsten von hexdump gemeldeten Adresse subtrahierte, konnte ich eine ~ 5-MB-Region identifizieren, die alle möglichen Kopien enthielt, was bedeutete, dass ich dd auf die niedrigste Adresse ausrichten und diese gesamte Region in eine temporäre Datei extrahieren konnte. Der Vim-Editor verarbeitet Binärinhalte jetzt recht elegant, sodass Sie das Tempfile untersuchen und nach Bedarf umformen können.

JonathanH-UK
quelle