GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Konvertieren Sie einen Hex-String in Binär und senden Sie ihn mit netcat

Ich habe das -r verwendet und -p wechseln Sie zu xxd :

$ echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181

Dank der Inspiration von @Gilles Antwort ist hier eine Perl-Version:

$ echo '0006303030304e43' | perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181

Hier eine Lösung ohne xxd oder perl :

Wenn die echo builtin Ihrer Shell unterstützt es (bash und zsh tun, aber nicht dash ), müssen Sie nur die richtigen Backslash-Escapes verwenden:

echo -ne '\x00\x06\x30\x30\x30\x30\x4e\x43' | nc -l localhost 8181

Wenn Sie /bin/echo haben von GNU Coreutils (fast Standard auf Linux-Systemen) oder von busybox können Sie es auch verwenden.

Mit sed Sie können ein maskiertes Muster generieren:

$ echo '0006303030304e43' | sed -e 's/../\\x&/g'
\x00\x06\x30\x30\x30\x30\x4e\x43

Kombiniert:

echo -ne "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181

Wenn Sie xxd haben , das ist einfach:es kann in und aus hexadezimal konvertieren.

echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181

Ich glaube nicht, dass es eine vernünftige (und einigermaßen schnelle) Möglichkeit gibt, hexadezimal in binär nur mit POSIX-Tools zu konvertieren. Es kann ziemlich einfach in Perl durchgeführt werden. Das folgende Skript konvertiert hexadezimal in binär und ignoriert alle Eingabezeichen, die keine hexadezimalen Ziffern sind. Es beschwert sich, wenn eine Eingabezeile eine ungerade Anzahl von Hexadezimalziffern enthält.

#!/usr/bin/env perl
$^W = 1;
$c = undef;
while (<>) {
    tr/0-9A-Fa-f//cd;
    if (defined $c) { warn "Consuming $c"; $_ = $c . $_; $c = undef; }
    if (length($_) & 1) { s/(.)$//; $c = $1; }
    print pack "H*", $_;
}
if (!eof) { die "$!"; }
if (defined $c) { warn "Odd number of hexadecimal digits"; }

Wenn Sie sich wirklich an POSIX halten müssen (z. B. auf einem eingebetteten Gerät), empfehle ich die Verwendung von Base64 anstelle von Hexadezimal. Sie können uudecode verwenden, um Base64 zu dekodieren. Die Eingabe muss das Header-Format und die von uuencode erzeugte Endzeile haben, es darf kein reines Base64 sein.

uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF

Linux
  1. ${!foo} Und Zsh?

  2. Eine Binärdatei mit Dd patchen?

  3. Slash und Backslash in Sed?

  4. Jedem Element von $* in der Shell eine Zeichenfolge voranstellen und anhängen?

  5. Wie konvertiere ich Hex in ASCII-Zeichen in der Linux-Shell?

Echo-Befehl in Linux (mit Beispielen)

Echo-Befehl in Linux mit Beispielen

Netcat (nc) Befehl mit Beispielen

Linux-Suche nach Zeichenfolgen in Ordnern und Dateien mit ack

So senden Sie eine E-Mail mit Anhang und Text von Linux

Linux-Shell-Scripting:Hexadezimalzahl in Binärzeichenfolge