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