¿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í:
De
A
SSH aB
, creando un túnel en el puerto 5000ssh someuser@B -L 5000:127.0.0.1:5000
A partir de ese shell
B
, SSHC
crea un segundo túnel que termina enC
el servidor ssh.ssh someuser@C -NL 5000:127.0.0.1:22
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 B
y 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..