it-swarm-es.tech

¿Cómo llevar el archivo a un Host cuando todo lo que tienes es una consola en serie?

Cuando todo lo que tiene es una consola en serie (por ejemplo, a través de telnet a través de un servidor de terminal), ¿qué métodos se pueden usar para transferir archivos dentro/fuera de un host?

Cortar/pegar funciona para las cosas pequeñas/imprimibles y he jugado con una combinación de uuencode/uudecode (con gzip) manejar lo no imprimible, pero todo es muy limitante.

22

Los programas de consola serie¹ que usará en el otro extremo de la conexión tendrán alguna forma de enviar un archivo al lado remoto. La forma exacta en que lo haga depende de los recursos que tenga disponibles en el sistema remoto.

Tengo lrzsz o Kermit en el lado remoto

El caso más fácil es si tiene un programa sólido de transferencia de archivos binarios instalado en el lado remoto, como lrzsz o Kermit . Esto fue una vez más común que hoy, pero su sistema particular aún podría tener uno de estos.

El programa de consola en serie que está utilizando en el lado local casi seguramente tiene una forma de hacer una carga de Zmodem o Kermit, que le permite enviar lo que necesite directamente.

En el caso de Zmodem, simplemente escriba rz en el sistema remoto, que envía una cadena especial que el terminal serial local debe entender, haciendo que aparezca un cuadro de diálogo de selección de archivos.

Kermit es un protocolo más simple, por lo que debe iniciar la transferencia manualmente en ese caso.

No tengo un programa de transferencia de archivos binarios, pero sí tengo uuencode/base64

Existen varias ventajas al usar un programa de transferencia de archivos binarios adecuado como lrzsz o Kermit: eficiencia, suma de comprobación, reintentos automáticos, reanudación de transferencia abortada, transferencia de archivos múltiples, etc., pero estos son: lujos . Si solo necesita enviar un archivo, o rara vez envía archivos, puede salirse con la carga ASCII).

Debido a que protocolos de terminal interpretan muchos de los valores de byte que ocurren en un archivo de datos binarios, no puede enviar el archivo directamente a través de la misma conexión; si lo hace, el código de emulación de terminal en cualquier extremo intentará interpretar algunos de los datos, corrompiendo los datos y probablemente confuso también el código de manejo del terminal.

Para evitar esto, codifique los datos binarios en un subconjunto seguro de ASCII en el lado local, y luego vuelva a convertirlos en datos binarios en bruto en el lado remoto. Esto es lo que el uuencode y base64 los programas sí, que difieren solo en las opciones de algoritmos menores.

En el sistema local, codifica el archivo: ²

$ uuencode -o sbf.uue some-binary-file.gz some-binary-file.gz

Luego, escriba este comando en el sistema remoto y envíe el archivo utilizando la función de "carga ASCII" de la consola serie local:

$ cat | uudecode

Cuando finalice la carga del archivo, presione Ctrl-C para salir de cat. Ahora tiene su archivo decodificado en el sistema remoto, como quería.

Pero tengo ¡Muchos Archivos para enviar e imprimibles ASCII ¡La transcodificación es un dolor!

No es difícil bootstrap hasta un nivel superior de tecnología. Si el sistema remoto tiene un compilador de C, puede utilizar la técnica anterior para enviar una copia de la copia del sistema remoto al lrzsz código fuente. En el lado local:

$ uuencode -o lrzsz.tgz.uue lrzsz-0.12.20.tar.gz lrzsz-0.12.20.tar.gz

Luego, en el sistema remoto, escriba esto a través del programa de consola serie:

$ cat | uudecode
^C
$ tar xvf lrzsz-0.12.20.tar.gz
...build lrzsz normally

Después de iniciar el primer comando, realice una "carga ASCII" de lrzsz.tgz.uue archivo al sistema remoto. La canalización acepta los datos sin codificar y los decodifica en un tarball binario para usted, que puede desempaquetar y construir.

Pero no tengo un compilador de C en el sistema remoto

Si ni siquiera tiene un compilador en el sistema remoto, puede compilación cruzada el programa rz (o lo que sea) en el sistema local y enviarlo al sistema remoto usando La técnica anterior.


Notas al pie:

  1. minicom , picocom , PuTTY , VanDyke CRT ...

  2. Debe dar el nombre del archivo de entrada a esta versión de uuencode dos veces, una vez para nombrar la fuente de los datos de entrada y otra vez para declarar cómo debe llamar el sistema remoto al archivo cuando decodifica los datos en una salida expediente. Es posible que desee que el sistema remoto tenga un nombre diferente para su archivo de salida.

    Su versión local de uuencode puede comportarse de manera diferente.

13
Warren Young

Básicamente, debe usar métodos anteriores a Internet para transferir a través de un tty en serie, y debe tener una forma de recibir la transferencia del otro lado. Obviamente, la mejor manera de hacerlo es usando ZMODEM, lo que significa que necesita tener una herramienta como sz ya en el extremo receptor. Sin embargo, esto no siempre es posible, por ejemplo, cuando el destino receptor es un enrutador sin red.

La única forma posible de hacer esta transferencia es directamente a través del canal, utilizando ASCII seguro para terminal, en un estilo limpio anterior a 8 bits. Voy a usar herramientas más modernas, que espero estén instaladas en la mayoría de los sistemas.

Remitente:

Primero codificamos nuestro archivo

base64 file.tar.gz > file.tar.gz.b64

Ahora asegúrese de que su comando com send-file sea, ascii-xfr, esta fue mi línea de comando de conexión

picocom -f n -p n -d 8 -b 115200  --send-cmd "ascii-xfr -snv" /dev/ttyS0

Normalmente queremos ascii-xfr en el lado receptor, pero como no lo tenemos, eso -n evita esto manteniendo las terminaciones de línea correctas.

Receptor:

Ahora que nos hemos conectado, vaya al directorio donde desea el archivo recibido.

cd /tmp/
cat > file.tar.gz.b64

En picocom, acabo de CTRL + a + s , e ingreso la ruta completa del archivo que estoy enviando. Una vez que se complete la transferencia, deberá CTRL + c para romper ese cat.

Ahora decodificamos el archivo,

base64 -d file.tar.gz.b64 > file.tar.gz

Haga lo que pueda para verificar que el archivo es IDÉNTICO al que envió, porque una transferencia ASCII no tiene protección de suma de verificación. Mi casilla de recepción tenía sha512sum, pero cualquier comando de suma de comprobación sería suficiente. Una vez que confirme manualmente la coincidencia de sumas, ¡puede asumir que la transferencia fue exitosa!

5
J. M. Becker

Tal vez deberías probar minicom .

5
elmarco

No sé si esto funcionaría si todo lo que tuviera fuera una consola en serie, pero si tiene acceso a la red, podría usar nc(1) para copiar archivos usando TCP/IP.

# WARNING: Depending on your setup, this could make your system unbootable
[email protected] # nc -l 8675 | dd of=/dev/sdXXX
[email protected] # dd if=/dev/sdYYY | nc destination-box.local 8675

En el ejemplo anterior, cloné sdbYYY de un cuadro de origen a sdaXXX del cuadro de destino. Mi elección de 8675 para un TCP fue arbitrario; podría usar cualquier puerto al que tenga acceso. Y no tiene que ser un dispositivo; puede ser cualquier archivo.

[email protected] $ nc -l 12345 >> ~/.ssh/authorized_keys
[email protected] $ cat ~/.ssh/id_rsa.pub | nc destination-box.local 12345

En el segundo ejemplo, copié mi clave pública rsa (~/.ssh/id_rsa.pub) y lo agregó al archivo de claves autorizado para el Host de destino.

5
Kevin M

Usaría Kermit , el abuelo de los programas de transferencia de archivos. Lo usamos mucho antes de que existiera Linux.

2
txwikinger