J'ai utilisé le -r et -p passer à xxd :
$ echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181
Grâce à l'inspiration de la réponse de @Gilles, voici une version perl :
$ echo '0006303030304e43' | perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181
Ici une solution sans xxd
ou perl
:
Si le echo
intégré de votre shell le prend en charge (bash
et zsh
faire, mais pas dash
), il vous suffit d'utiliser les bons échappements antislash :
echo -ne '\x00\x06\x30\x30\x30\x30\x4e\x43' | nc -l localhost 8181
Si vous avez /bin/echo
à partir de GNU coreutils (presque standard sur les systèmes Linux) ou de busybox, vous pouvez également l'utiliser.
Avec sed
vous pouvez générer un motif échappé :
$ echo '0006303030304e43' | sed -e 's/../\\x&/g'
\x00\x06\x30\x30\x30\x30\x4e\x43
Combiné :
echo -ne "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181
Si vous avez xxd
, c'est facile :il peut convertir vers et depuis l'hexadécimal.
echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181
Je ne pense pas qu'il existe un moyen raisonnable (et raisonnablement rapide) de convertir l'hexadécimal en binaire en utilisant uniquement les outils POSIX. Cela peut être fait assez facilement en Perl. Le script suivant convertit l'hexadécimal en binaire, en ignorant tout caractère d'entrée qui n'est pas un chiffre hexadécimal. Il se plaint si une ligne d'entrée contient un nombre impair de chiffres hexadécimaux.
#!/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"; }
Si vous avez vraiment besoin de vous en tenir à POSIX (par exemple sur un appareil intégré), je vous recommande d'utiliser Base64 au lieu de l'hexadécimal. Vous pouvez utiliser uudecode pour décoder Base64. L'entrée doit avoir le format d'en-tête et la ligne de fin produite par uuencode, elle ne peut pas être brute Base64.
uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF