Mover archivos entre hosts usando un área de almacenamiento intermedio

Mover archivos entre hosts usando un área de almacenamiento intermedio

¿Existe alguna buena solución para mover archivos del host A al host C, utilizando el host B como un área de almacenamiento intermedia pasiva?

A->B->C

Limitaciones

  • El host A y el host C están en redes separadas y no pueden acceder entre sí. No se pueden abrir túneles entre A y C.
  • Tanto el host A como el host C pueden ejecutar y programar procesos periódicos.
  • El host B solo proporciona un área de almacenamiento y se puede acceder a él tanto desde el host A como desde el host C a través de SSH.
  • B será "pasivo" y sólo proporcionará el área de almacenamiento.
  • Por lo tanto, A actuará como escritor (de archivos en B) y C actuará como lector (de archivos en B).
  • Los archivos que se copian correctamente del host A al host C (a través de B) se pueden eliminar en el host A.
  • No se debe eliminar ningún archivo en el host A hasta que haya una garantía (¿un recibo que contenga una suma de verificación del archivo?) de que ha aterrizado exitosamente en el host C.
  • Los casos de esquina incluyen la gestión del tiempo de inactividad de la red, disco lleno, procesos interrumpidos, etc.

El objetivo es, a intervalos regulares, mover archivos de A a C, utilizando B como área de almacenamiento intermedia.

Podemos asumir que todos los hosts ejecutan Unix/Linux. Herramientas preferidas: ssh/rsync/bash + otras herramientas "estándar".

Estaba pensando en crear una solución mediante el uso de algunos scripts bash en torno a rsync en dos pasos y el uso de recibos que contengan sumas de verificación para detectar cuándo un archivo se mueve correctamente por completo.

¿Existen soluciones?

Respuesta1

No veo la necesidad de almacenar nada en B, simplemente puedes usarlo para conexiones proxy entre A y C usando cualquier software proxy, como reenvío de puertos ssh o calcetines. ¿Quizás incluso podrías enrutar/nat a través de B?

O, como usted lo solicitó específicamente, para hacerlo a su manera, puede usar NFS/Samba para copiar los archivos y verificar la finalización utilizando varios métodos. Lo que me viene a la mente sería crear un archivo en el recurso compartido para pasar mensajes de tipo "copia completa" o "ok para eliminar" entre ambos sistemas. O como dijiste, algo con MD5, etc... Como sea que lo hagas, estoy bastante seguro de que será un trabajo personalizado. Pero no es difícil. Dudo que existan formas de abordar su problema de esa manera.

Respuesta2

El comentario de Sven a su pregunta es definitivamente la forma correcta de hacerlo.

Puedes hacerlo así:

  1. De ASSH a B, creando un túnel en el puerto 5000

    ssh someuser@B -L 5000:127.0.0.1:5000
    
  2. A partir de ese shell B, SSH Ccrea un segundo túnel que termina en Cel servidor ssh.

    ssh someuser@C -NL 5000:127.0.0.1:22
    
  3. Desde una segunda terminal en adelante A, sincronice sus archivos directamente aC

    rsync -avz -e "ssh -p 5000" --progress --remove-source-files /source/directory [email protected]:/destination/directory
    

Incluso podría ser posible configurar los túneles en los pasos 1 y 2 con un solo comando, pero en la prueba rápida que hice, no pude hacerlo. Es posible que sea necesario configurar claves ssh en By C.

Si va a automatizar el proceso de copia, es posible que deba mirar algo comoautosshpara configurar y desmantelar los túneles por usted a través de servicios. O podrías hacerlo vía cron..

información relacionada