GNU/Linux >> Tutoriales Linux >  >> Linux

convertir una cadena hexadecimal a binario y enviar con netcat

Usé el -r y -p cambiar a xxd :

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

Gracias a la inspiración de la respuesta de @Gilles, aquí hay una versión en perl:

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

Aquí una solución sin xxd o perl :

Si el echo incorporado de su shell lo admite (bash y zsh hacer, pero no dash ), solo necesita usar los escapes de barra invertida correctos:

echo -ne '\x00\x06\x30\x30\x30\x30\x4e\x43' | nc -l localhost 8181

Si tienes /bin/echo desde GNU coreutils (casi estándar en sistemas Linux) o desde busybox también puede usarlo.

Con sed puede generar un patrón de escape:

$ echo '0006303030304e43' | sed -e 's/../\\x&/g'
\x00\x06\x30\x30\x30\x30\x4e\x43

Combinado:

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

Si tienes xxd , eso es fácil:puede convertir hacia y desde hexadecimal.

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

No creo que haya una forma razonable (y razonablemente rápida) de convertir hexadecimal a binario usando solo herramientas POSIX. Se puede hacer bastante fácil en Perl. El siguiente script convierte hexadecimal a binario, ignorando cualquier carácter de entrada que no sea un dígito hexadecimal. Se queja si una línea de entrada contiene un número impar de dígitos hexadecimales.

#!/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 realmente necesita apegarse a POSIX (por ejemplo, en un dispositivo integrado), le recomiendo usar Base64 en lugar de hexadecimal. Puede usar uudecode para decodificar Base64. La entrada debe tener el formato de encabezado y la línea final producidos por uuencode, no puede ser Base64 sin procesar.

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

Linux
  1. ¿Recortar con Lvm y Dm-crypt?

  2. ${!foo} ¿Y Zsh?

  3. ¿Script de shell con función y parámetro como variables?

  4. Abra, extraiga y convierta archivos ISO, BIN y DAA en Linux o macOS con PowerISO gratuito

  5. ¿Cómo convertir caracteres hexadecimales a ASCII en el shell de Linux?

Comando Echo en Linux (con ejemplos)

Comando Echo en Linux con ejemplos

Comando Netcat (nc) con ejemplos

Linux busca cadenas en carpetas y archivos con ack

¿Cómo ver datos binarios sin procesar como una imagen con ancho y alto dados?

¿Cómo dividir una cadena con comillas (como argumentos de comando) en bash?