Ho usato -r e -p passa a xxd :
$ echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181
Grazie all'ispirazione della risposta di @Gilles, ecco una versione perl:
$ echo '0006303030304e43' | perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181
Qui una soluzione senza xxd
o perl
:
Se echo
integrato nella tua shell lo supporta (bash
e zsh
fare, ma non dash
), devi solo usare la barra rovesciata corretta:
echo -ne '\x00\x06\x30\x30\x30\x30\x4e\x43' | nc -l localhost 8181
Se hai /bin/echo
da GNU coreutils (quasi standard sui sistemi Linux) o da busybox puoi usarlo anche tu.
Con sed
puoi generare uno schema con escape:
$ echo '0006303030304e43' | sed -e 's/../\\x&/g'
\x00\x06\x30\x30\x30\x30\x4e\x43
Combinato:
echo -ne "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181
Se hai xxd
, è facile:può convertire in e da esadecimale.
echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181
Non penso che ci sia un modo ragionevole (e ragionevolmente veloce) per convertire esadecimale in binario usando solo strumenti POSIX. Può essere fatto abbastanza facilmente in Perl. Lo script seguente converte l'esadecimale in binario, ignorando qualsiasi carattere di input che non sia una cifra esadecimale. Si lamenta se una riga di input contiene un numero dispari di cifre esadecimali.
#!/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"; }
Se hai davvero bisogno di attenersi a POSIX (ad esempio su un dispositivo integrato), ti consiglio di utilizzare Base64 anziché esadecimale. Puoi usare uudecode per decodificare Base64. L'input deve avere il formato dell'intestazione e la riga finale prodotti da uuencode, non può essere Base64 grezzo.
uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF