J'ai un fichier binaire que je peux envoyer avec netcat
:
$ nc -l localhost 8181 < my.dat
Le fichier contient ceci:
$ xxd my.dat
0000000: 0006 3030 3030 4e43 ..0000NC
Ce que je veux vraiment, c'est envoyer directement la chaîne hexadécimale. J'ai essayé ça:
$ echo '0006303030304e43' | nc -l localhost 8181
Cependant, la commande ci-dessus envoie simplement la chaîne ascii directement à nc
.
J'ai utilisé les commutateurs - r et - p sur xxd:
$ echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181
Grâce à l'inspiration de la réponse @Gilles, voici une version Perl:
$ echo '0006303030304e43' | Perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181
Voici une solution sans xxd
ou Perl
:
Si le echo
intégré à votre Shell le prend en charge (bash
et zsh
le font, mais pas dash
), vous avez juste besoin pour utiliser la bonne barre oblique inverse:
echo -ne '\x00\x06\x30\x30\x30\x30\x4e\x43' | nc -l localhost 8181
Si tu as /bin/echo
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 modèle é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 simple: il peut se convertir vers et depuis 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 des outils POSIX. Cela peut être fait assez facilement en Perl. Le script suivant convertit l'hexadécimal en binaire, 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 devez vraiment vous en tenir à POSIX (par exemple sur un périphérique intégré), je vous recommande d'utiliser Base64 au lieu de hexadécimal. Vous pouvez utiliser decode pour décoder Base64. L'entrée doit avoir le format d'en-tête et la ligne de fin produits par encode , il ne peut pas s'agir de Base64 brut.
uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF
Similaire à ceci: https://stackoverflow.com/questions/1604765/linux-Shell-scripting-hex-string-to-bytes/47253233#472532
J'ai écrit un outil qui effectue diverses transformations de stdin et crache le résultat en stdout. cryptocli dd
ne fera que ces transformations et rien d'autre.
echo -n 0006303030304e43 | cryptocli dd -decoders hex | nc -l localhost 8081
Fonctionnera pour vous.
L'outil est open source, vous pouvez le trouver ici: https://github.com/tehmoon/cryptocli
Vous pouvez également encoder directement en hexadécimal en utilisant mon outil:
cat my.dat | cryptocli dd -encoders hex | nc -l localhost 8081