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

21

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.

Stephen Paul Lesniewski
fuente
Teniendo en cuenta algunos de los comentarios que ha dejado sobre la disponibilidad de las utilidades, sería útil si pudiera nombrar la plataforma y / o describir el entorno en el que se encuentra. De lo contrario, obtendrá el stock Kermit / XMODEM / YMODEM / ZMODEMk a través de respuestas de la terminal ...
Avery Payne
Paso la mayor parte del día detrás de la caja de Solaris. Entonces, en esos términos, si todo lo que tuvieras fuera SUNCreq (o quizás SUNWCuser), ¿cuál sería la respuesta?
Stephen Paul Lesniewski
solo 5 años de retraso: P Ahora puedes aceptar mi respuesta, porque era exactamente lo que querías ... pero probablemente no la necesites hoy.
JM Becker

Respuestas:

13

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 lrzszo kermiten 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 lrzszo 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 rzen 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 lrzszo kermit: eficiencia, suma de verificació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 las cargas ASCII.

Debido a que los 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 cualquiera de los extremos intentará interpretar algunos de los datos, corrompiendo los datos y probablemente también confundiendo 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 hacen los programas uuencodey base64, 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 escribe este comando en el sistema remoto y envía el archivo utilizando la función de "carga ASCII" de la consola serie local:

$ cat | uudecode

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

¡Pero tengo muchos archivos para enviar, y la transcodificación ASCII imprimible es una molestia!

No es difícil iniciarse en un nivel superior de tecnología. Si el sistema remoto tiene un compilador de C, puede usar la técnica anterior para enviar una copia del lrzszcódigo fuente al sistema remoto . 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" del lrzsz.tgz.uuearchivo 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 realizar una compilación cruzada del programa rz(o lo que sea) en el sistema local y enviarlo al sistema remoto utilizando la técnica anterior.


Notas al pie:

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

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

    Su versión local de uuencodepuede comportarse de manera diferente.

Warren Young
fuente
¡Fantástico, esperaba que esta pregunta tuviera una respuesta que mencionara kermit! +1;)
Tim
Esta es una buena respuesta, me gusta la sección "Pero no tengo". Desafortunadamente, se detiene en cosas bastante pop y no va muy profundo. ¿Crear archivos binarios ejecutables para diferentes arquitecturas a partir de códigos ASCII? Aquí está para bootstrap: retrocomputing.stackexchange.com/questions/4672/…
pfalcon el
5

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 la que szya está 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-xfren el lado receptor, pero como no lo tenemos, eso -nfunciona al mantener los finales de línea correctos.

Receptor:

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

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

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

Ahora decodificamos el archivo,

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

Haga lo que pueda para verificar que el archivo sea IDÉNTICO al que envió, porque una transferencia ASCII no tiene protección de suma de verificación. Mi caja de recepción tenía sha512sum, pero cualquier comando de suma de verificación sería suficiente. Una vez que confirme manualmente la coincidencia de sumas, puede asumir que la transferencia se realizó correctamente.

JM Becker
fuente
(Y dos años después ...) en mi experiencia al tener que transferir archivos a través de sistemas que combinan terminaciones de línea (¡gracias Microsoft!), La codificación / decodificación base64 no se preocupa por el estilo de finalización de línea. \r\no simplemente \nambos funcionan incluso si se "arreglan" en el camino. No recuerdo de improviso si está en el estándar base64 o solo en las herramientas que utilicé, pero sospecho que en realidad es un comportamiento estándar.
Andrew Henle
5

Tal vez deberías probar el minicom .

elmarco
fuente
¿No requiere esto algo como 'sx' o 'sz' en el host de origen?
Stephen Paul Lesniewski
44
No, minicom maneja sus propios archivos xfers. sx, sy, sz y rx, ry, rz son programas separados, que generalmente se encuentran en paquetes llamados adecuadamente lszrz o algo así. Aunque sugeriría usar sz y rz. Pequeño, simple y hace lo que hace. Minicom es un emulador de terminal completo.
reiche
44
Esta respuesta no es correcta. Minicom genera lrzsz para transferencias de archivos. Minicom no puede y no maneja sus propias transferencias de archivos.
Jonathan Cline IEEE
5

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 usarlo 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é sdbYYYdesde un cuadro de origen al cuadro sdaXXXde destino. Mi elección de 8675 para un número de puerto TCP fue arbitraria; puede 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 la agregué al archivo de claves autorizado para el host de destino.

Kevin M
fuente
55
¿Puedo sugerir una gran señal de advertencia roja sobre tu primera idea? Algunos alma solitaria con el corazón para aprender podría ejecutar algo así en la esperanza de la copia de archivos sólo, sin necesidad de leer el siguiente párrafo primero, por supuesto :)
reiche
2

Me gustaría utilizar kermit , el abuelo de los programas de transferencia de archivos. Lo usamos mucho antes de que existiera Linux.

txwikinger
fuente
ahh sí ... recuerdo haberlo hecho, pero en este caso kermit no está instalado en el host de origen.
Stephen Paul Lesniewski