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.
solaris
console
serial-console
Stephen Paul Lesniewski
fuente
fuente
Respuestas:
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
okermit
en el lado remotoEl caso más fácil es si tiene un programa sólido de transferencia de archivos binarios instalado en el lado remoto, como
lrzsz
okermit
. 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
okermit
: 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
uuencode
ybase64
, que difieren solo en las opciones de algoritmos menores.En el sistema local, codifica el archivo: ²
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:
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
lrzsz
código fuente al sistema remoto . En el lado local:Luego, en el sistema remoto, escriba esto a través del programa de consola serie:
Después de iniciar el primer comando, realice una "carga ASCII" del
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 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:
minicom , picocom , PuTTY , VanDyke CRT ...
uuencode
Debe 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
uuencode
puede comportarse de manera diferente.fuente
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
sz
ya 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
Ahora asegúrese de que su comando com send-file sea
ascii-xfr
, esta fue mi línea de comando de conexiónNormalmente queremos
ascii-xfr
en el lado receptor, pero como no lo tenemos, eso-n
funciona al mantener los finales de línea correctos.Receptor:
Ahora que nos hemos conectado, vaya al directorio donde desea el archivo recibido.
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,
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.fuente
\r\n
o simplemente\n
ambos 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.Tal vez deberías probar el minicom .
fuente
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.En el ejemplo anterior, cloné
sdbYYY
desde un cuadro de origen al cuadrosdaXXX
de 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.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.fuente
Me gustaría utilizar kermit , el abuelo de los programas de transferencia de archivos. Lo usamos mucho antes de que existiera Linux.
fuente