Me gustaría transferir archivos entre dos hosts remotos utilizando un shell local, pero parece que rsync no admite la sincronización si se especifican dos controles remotos de la siguiente manera:
$ rsync -vuar host1:/var/www host2:/var/www
The source and destination cannot both be remote.
¿Qué otras soluciones / comandos podría usar para lograr resultados similares?
sshfs
es que luegorsync
ve los sistemas de archivos de origen y de destino como locales, por lo que deshabilita su algoritmo delta. En ese punto, casi podrías usarlocp -p
. Vea la respuesta que propone esto y sus comentarios posteriores.Respuestas:
Como ha descubierto, no puede usar rsync con una fuente remota y un destino remoto. Suponiendo que los dos servidores no pueden comunicarse directamente entre sí, es posible usar ssh para hacer un túnel a través de su máquina local.
En lugar de
puedes usar esto
En caso de que se lo pregunte, la
-R
opción configura un canal inverso desde el puerto 50000 en el host1 que se asigna (a través de su máquina local) al puerto 22 en el host2. No hay conexión directa de host1 a host2.fuente
sshfs
montar ambos directorios remotos localmente, luego los utilicérsync
en los dos directorios montados localmente.-i
para especificar las claves necesarias para los comandos ssh.-i key...
parámetro dentro de las comillas después delssh
comando. Si eso no le ayuda, no dude en hacer una Nueva Pregunta, haciendo referencia a esta respuesta para el contextoscp -3
.No dijiste por qué no querías iniciar sesión en un host y luego copiar al otro, así que compartiré una de mis razones y soluciones.
No pude iniciar sesión en una máquina y luego sincronizar con la otra porque ninguno de los hosts tenía una clave SSH que podía iniciar sesión en la otra. Resolví esto usando el reenvío de agente SSH para permitir que el primer host use mi clave SSH mientras estaba conectado.
ADVERTENCIA: el reenvío SSH permite que el host use su clave SSH durante la duración de su inicio de sesión. Si bien no pueden copiar su clave, pueden iniciar sesión en otras máquinas con ella. Asegúrese de comprender los riesgos y no utilice el reenvío de agentes para máquinas en las que no confía.
El siguiente comando utilizará el reenvío del agente SSH para abrir una conexión directa desde
host1
hastahost2
. Esto tiene la ventaja de que la máquina que ejecuta el comando no está bloqueando la transferencia.fuente
-D
lugar de-A
moverse por la red en lugar de las restricciones clave); para explicar la ventaja; para que la orden sea corta; y realmente funciona Tenga en cuenta que es posible que deba especificarusername@host1
si es diferente del nombre de usuario local. Además, rsync realiza la verificación de la clave del host cuando se conecta al host2, por lo que la clave del host1 ya debería estar en ~ / .ssh / known_hosts en el host2 o el comando fallará.ssh -A
, ver confluencia. jetbrains.com/display/TCD10/SSH+Agent ).Me gusta la respuesta de Roaima, pero los caminos son los mismos en ambos ejemplos, oscureciendo cuál es cuál. Hemos establecido que lo siguiente no funciona:
Pero esto sí (omití la dirección explícita de enlace de localhost de la
-R
opción, ya que ese es el valor predeterminado):Tenga en cuenta que deberá tener las claves ssh configuradas correctamente entre los dos hosts remotos, con la clave privada en host1 y la clave pública en host2.
Para depurar la conexión, divídalo en dos partes y agregue el estado detallado:
Si esto funciona, tendrás un shell en host1. Ahora prueba el comando rsync de host1. Recomiendo hacer esto en una ventana diferente para que la información detallada de ssh no se mezcle con la información de estado de rsync:
fuente
rsync
se inicia en host1 con el objetivo en host2. (Podría haber pedido una aclaración en un comentario.)Reformateando la respuesta de roaima en la sintaxis de script bash (y agregando caracteres de continuación de línea '\' para mayor claridad) Elegí al azar el puerto 22000 ...
fuente
La forma ideal sería ejecutar
rsync
uno de esos servidores. Pero si no desea ejecutar un script en el servidor remoto. Puede ejecutar un script en su sistema local y hacer un ssh y ejecutar el rsync allí.ssh user@$host1 <<ENDSSH >> /tmp/rsync.out 2>&1 rsync -vuar /var/www host2:/var/www ENDSSH
Además, como ya sabrá, rysnc realiza una sincronización unidireccional. Si desea una sincronización bidireccional, puede consultar osync ( https://github.com/deajan/osync ). Lo uso y me pareció útil.
fuente
Solo como información adicional:
Si usa un host de salto para conectar las otras dos máquinas pero no pueden comunicarse entre sí directamente, puede usar sshfs como medio entre estas dos máquinas de la siguiente manera (en el host de salto):
SSHFS proporciona las dos rutas en el host de salto y rsync gestiona la sincronización de los archivos como siempre (solo con la diferencia de que prácticamente se hace localmente).
fuente
Puede ejecutar un rsyncd (servidor) en una de las computadoras.
Este es el enfoque que estoy tomando, ya que no quiero usar ssh para permitir que el acceso 'fuente' (en redacción rsync) al 'destino' como root sin contraseña (como se requiere para usar el túnel SSH con rsync en un guión)
En mi caso, simplemente configuré un servidor rsyncd en la computadora de destino con un solo usuario permitido desde la PC fuente y usé rsync desde el lado fuente.
Funciona genial.
fuente
Intenta usar esto. Esto funciona para mi.
fuente
Un guión fácil de usar
A lo largo de los años, he hecho esto muchas veces con más o menos los mismos trucos que en cualquier otra respuesta aquí. Sin embargo, debido a que es muy fácil equivocarse en algunos detalles y pasar mucho tiempo resolviendo el problema, se me ocurrió el siguiente script:
ssh -A
no se propagan los datos de autenticación (no sé por qué sucede esto a veces, ya que la solución fue más fácil que encontrar la causa raíz)Cómo usar el guión
Cómo funciona
Como dije, usa los mismos trucos que en cualquier otra respuesta aquí:
-R
opción de ssh para ssh de localhost a host1 mientras que al mismo tiempo configura un reenvío de puertos que luego permite que host1 se conecte a través de localhost a host2 (-R localhost:$FREE_PORT:$TARGET_ADDR_PORT
)-A
Opción de ssh para permitir la autenticación fácil del segundo canal ssh¡Esto es complicado! ¿Hay alguna manera más fácil?
Al copiar todos o la mayoría de los bytes del origen al destino, es MUCHO más fácil de usar
tar
:La secuencia de comandos
fuente
tar
es genial cuando tienes una sola transferencia (no incremental) y tu transferencia se completa en una sola pasada. Por otro lado,rsync
con reenvío maneja reinicios y transferencias incrementales.Es posible usar
tar
viassh
para transferir los archivos:Cambie el
j
parámetro (fortar
) az
dos lugares si desea comprimir el archivo congzip
, en lugar debzip2
. Por lo general,bzip2
tiene la compresión más alta quegzip
, pero es más lenta, así que cámbiela según sus necesidades (consulte: bzip2 vs gzip ).Relacionado: ¿Cómo copiar entre dos hosts remotos usando tar entubado en SSH desde un servidor remoto cuando está detrás de un firewall?
Alternativamente (para proteger el ancho de banda, debido a la compresión transparente) es posible usarlo
sshfs
para montar el sistema de archivos remoto como local y usarlorsync
como de costumbre, p. Ej.fuente