convertiți un șir hexagonal în binar și trimiteți-l cu netcat (Unix, Linux, Binar, Netcat)

Chris Snow a intrebat.

Am un fișier binar pe care îl pot trimite cu netcat:

$ nc -l localhost 8181 < my.dat

Fișierul conține următoarele:

$ xxd my.dat
0000000: 0006 3030 3030 4e43                      ..0000NC

Ceea ce vreau cu adevărat să fac este să trimit direct șirul hexagonal. Am încercat acest lucru:

$ echo '0006303030304e43' | nc -l localhost 8181

Cu toate acestea, comanda de mai sus trimite doar șirul ascii direct către nc.

Comentarii

  • Notă disproporționată cu titlul. -l parametrul pentru netcat înseamnă într-adevăr să asculte. Acesta nu trimite datele date, ci ascultă conexiunea de intrare și după conectare va trimite datele date. Pentru a trimite date către un anumit server, trebuie doar să eliminați -l parametrul. –  > Por Lubo.
4 răspunsuri
Chris Snow

Am folosit -r și -p pentru a xxd:

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

Mulțumită inspirației din răspunsul lui @Gilles, iată o versiune perl:

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

Comentarii

  • Funcționează foarte bine pentru formatul hexagonal bytea din Postgres, odată ce x-ul din față este eliminat. –  > Por nathancahill.
  • Mulțumesc! Funcționează foarte bine și pentru verificarea digestărilor dicționarelor Firefox în manifest! md5sum ../it/manifest.json | awk '{print $1}' | xxd -r -p | hd –  > Por Avio.
jofel

Aici o soluție fără xxd sau perl:

În cazul în care echo builtin al shell-ului dvs. îl acceptă (bash și zsh o face, dar nu și dash), trebuie doar să folosiți scăpările backslash corecte:

echo -ne 'x00x06x30x30x30x30x4ex43' | nc -l localhost 8181

Dacă aveți /bin/echo de la GNU coreutils (aproape standard pe sistemele Linux) sau de la busybox, îl puteți folosi și dvs.

Cu sed puteți genera un model scăpat:

$ echo '0006303030304e43' | sed -e 's/../\x&/g'
x00x06x30x30x30x30x4ex43

Combined:

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

Comentarii

  • o soluție foarte bună! –  > Por Chris Snow.
  • Înlocuirea echo cu printf înlătură ghicitul dacă echo suportă sau nu caracteristici extinse. printf "$(echo '0006303030304e43' | sed -e 's/../\x&/g')" | nc -l localhost 8181. –  > Por Jaakko.
Gilles ‘SO- nu mai fi rău’

Dacă aveți xxd, este ușor: poate converti în și din hexazecimal.

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

Nu cred că există o modalitate rezonabilă (și rezonabil de rapidă) de a converti hexadecimalul în binar folosind doar instrumente POSIX. Se poate face destul de ușor în Perl. Următorul script convertește hexadecimalul în binar, ignorând orice caracter de intrare care nu este o cifră hexadecimală. Se plânge dacă o linie de intrare conține un număr impar de cifre hexadecimale.

#!/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"; }

Dacă chiar trebuie să respectați POSIX (de exemplu, pe un dispozitiv încorporat), vă recomand să utilizați Base64 în loc de hexazecimal. Puteți utiliza uudecode pentru a decoda Base64. Datele de intrare trebuie să aibă formatul antetului și linia de sfârșit produsă de uuencode, nu poate fi Base64 brut.

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

tehmoon

Similar cu acesta: https://stackoverflow.com/questions/1604765/linux-shell-scripting-hex-string-to-bytes/47253233#47253233

Am scris o unealtă care efectuează diverse transformări din stdin și scuipă rezultatul în stdout. cryptocli dd va face doar acele transformări și nimic altceva.

echo -n 0006303030304e43 | cryptocli dd -decoders hex | nc -l localhost 8081

Va funcționa pentru tine.

Instrumentul este open source, îl puteți găsi aici: https://github.com/tehmoon/cryptocli

Editați:

Puteți, de asemenea, să codificați direct în hexagonal folosind instrumentul meu:

cat my.dat | cryptocli dd -encoders hex | nc -l localhost 8081

Comentarii

  • (1) Ce înseamnă 616263 are legătură cu această întrebare?  Vă rugăm să folosiți datele din întrebare.  (2) Poți explica cum funcționează acest lucru? Vă rugăm să nu răspundeți în comentarii, editați-vă răspunsul pentru a-l face mai clar și mai complet. –  > Por G-Man spune „reintroduceți-o pe Monica.