Pregunta:
Tengo acceso a 3 máquinas, A, B y C. Las únicas conexiones posibles (ssh) son:
A -> B
B <-> C
Necesito obtener archivos de A a C, para poder realizar un scp de los archivos de A a B, y luego scp de B a C. Sin embargo, B no tiene mucho espacio en el disco, así que esta no es una opción. ¿Hay alguna manera de transferir archivos scp de A a C a través de B? Tenga en cuenta que no tengo acceso de root en ninguna de las máquinas, así que no creo que pueda configurar túneles persistentes, ¡pero corríjame si me equivoco!
Respuesta:
ProxyJump
Nuevo en OpenSSH 7.3:
A$ scp -oProxyJump=B thefile C:destination
(Detrás de escena, esto solo usa ProxyCommand y ssh -W
).
ProxyCommand
Actualizado para incluir -W de otras respuestas:
A$ scp -oProxyCommand="ssh -W %h:%p B" thefile C:destination
Si A tiene un cliente SSH muy antiguo instalado (sin soporte -W
), o si B está configurado para no permitir el reenvío de TCP (pero aún permite comandos de shell), use alternativas:
A$ scp -oProxyCommand="ssh B socat stdio tcp:%h:%p" thefile C:destination
A$ scp -oProxyCommand="ssh B nc %h %p" thefile C:destination
Tubería
A$ tar cf - thefile anotherfile | ssh B "ssh C \"cd destination && tar xvf -\""
A$ (echo thefile; echo anotherfile) | cpio -o | ssh B "ssh C \"cd destination && cpio -i\""
Para un solo archivo:
A$ ssh B "ssh C \"cd destination && cat > thefile\"" < thefile
"Túnel" a través de B
A$ ssh -f -N -L 4567:C:22 B
(continues running in background)
A$ scp -P 4567 thefile localhost:destinationPath
Cuando haya terminado, no olvide eliminar el proceso ssh
iniciado anteriormente (que ha pasado a segundo plano debido a -f -N
).
-
-f
Solicita a ssh que pase a segundo plano justo antes de la ejecución del comando. Esto es útil si ssh va a solicitar contraseñas o frases de contraseña, pero el usuario lo quiere en segundo plano. Esto implica -n. -
-N
No ejecute un comando remoto. Esto es útil solo para reenviar puertos.
Invertir el "túnel" a través de B hacia A
Sin embargo, no siempre funciona:
A$ ssh -f -N -R 4567:localhost:22 B
(now you can reach A from B, by using localhost:4567)
B$ scp -P 4567 localhost:thefile C:destination
-R
Especifica que las conexiones al puerto TCP dado o al socket Unix en el host remoto (servidor) se reenviarán al host y puerto dado, o socket Unix, en el lado local.