scp entre dos servidores que no están en la misma red

13

Hay dos servidores a los que puedo acceder con 2 conexiones VPN diferentes. He logrado que ambas VPN funcionen al mismo tiempo en mi máquina (un poco de reglas de enrutamiento).

Quiero hacer una scp <remote1>:some/file <remote2>:destination/folderdesde la terminal de mi computadora portátil. Pero cuando intento esto, el scpcomando que se invoca en remote1 no puede encontrar remote2 porque no están en la misma red. ¿Es posible forzar que el scpcomando pase a través de mi computadora portátil como un enrutador?

Si lo intento con Nautilus (conectar al servidor, ambos servidores, luego copiar y pegar) funciona, pero me gustaría hacerlo desde un terminal.

Danduk82
fuente
Es su máquina la que contacta a ambos, remoto1 y remoto2 . ¿Estás seguro de que el error es que remoto1 no puede acceder a remoto2 ?
Jan
Sí, el error es ssh: no se pudo resolver el nombre de host <remote2>: se perdió el nombre o el servicio, se perdió la conexión
Danduk82
Y si trato de usar la dirección IP directamente para <remote2>, la conexión falla después de un tiempo (hangout).
Danduk82
Entonces supongo que es su máquina la que no puede conectarse al control remoto2 . Tal vez los tiempos de conexión VPN fuera o es raro ...
Ene
No, funciona, incluso el DNS está funcionando. Realmente tengo la sensación de que el comando scp intenta ejecutar la conexión entre remote1 y remote2 directamente en remote1 .
Danduk82

Respuestas:

34

Las versiones más nuevas de scp tienen la opción -3

-3

Copies between two remote hosts are transferred through the local host. Without this option the data is copied directly between the two remote hosts
Andy
fuente
¡genial! Exactamente lo que necesitaba. Muchas gracias
Danduk82
1
Gran descubrimiento, ¡no lo sabía!
Jan
9

Si necesita más flexibilidad que scp -3, llanura sshy tuberías son divertidas.

Esto es equivalente a redirigir la transmisión a través de la máquina local:

ssh sourceRemote 'cat /path/to/sourceFile' \
| ssh destinationRemote 'cat > /path/to/destinationFile'

Luego puede agregar más redirecciones de flujo en cualquier punto, por ejemplo, para encadenar varias máquinas intermedias, o guardar una copia local del archivo transferido mientras se enruta.

Anko
fuente
2
Obtendrá una buena barra de progreso si la máquina fuente se ha pvinstalado y reemplaza la primera catcon ella.
liori
6

Ampliando la respuesta de @ Anko, puede usar tarpara múltiples archivos:

ssh -q user@sourcehost 'cd /source/path; tar -czf - files...' | \
ssh -q user@desthost 'cd /dest/path; tar -xzf -'

La compresión es completamente opcional: sus datos pueden no ser muy comprimibles o lo suficientemente grandes como para garantizar la sobrecarga. Si su versión de tarno es compatible con el -zconmutador, canalice gzip -cy gzip -dcrespectivamente.

PD: Cuidado con las versiones de tar eso que no eliminan las barras diagonales principales en la extracción (es decir, escriba en nombres de ruta absolutos si se proporcionan).

Editar: -e noneno es necesario con tuberías, porque no se asigna un pseudo-terminal.

arielCo
fuente
1
sshtiene una -Cbandera para habilitar la compresión de flujo. De acuerdo con la página man, utiliza el mismo algoritmo que gzipsi. La página del manual también aclara útilmente cuándo usarla: "La compresión es deseable en las líneas de módem y otras conexiones lentas, pero solo ralentizará las cosas en las redes rápidas".
Anko
44
@Anko, el problema con el uso -Caquí es que la máquina local tendría que descomprimir y volver a comprimir los datos. Decirle tarque haga la compresión significa que los datos comprimidos se pasan directamente a través de la tubería sin ningún procesamiento.
cjm