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 scp los archivos de A a B, y luego scp de B a C. Sin embargo, B no tiene mucho espacio en disco, por lo que esta no es una opción. ¿Hay alguna manera de scp archivos 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 piense que puedo configurar túneles persistentes, ¡pero corríjame si me equivoco!
A$ rsync <options> -e 'ssh B ssh' source C:destination
Respuestas:
ProxyJump
Nuevo en OpenSSH 7.3:
(Detrás de escena, esto solo usa ProxyCommand y
ssh -W
).ProxyCommand
Actualizado para incluir -W de otras respuestas:
Si A tiene un cliente SSH muy antiguo instalado (sin
-W
soporte), o si B está configurado para no permitir el reenvío TCP (pero aún permite comandos de shell), use alternativas:Tubería
Por solo un archivo:
"Túnel" a través de B
Cuando haya terminado, no olvide matar el
ssh
proceso iniciado anteriormente (que se ha caído al fondo debido a-f -N
).-f
Solicita a ssh que vaya al fondo justo antes de la ejecución del comando. Esto es útil si ssh va a pedir 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.Invierta el "túnel" a través de B a A
Sin embargo, no siempre funciona:
-R
Especifica que las conexiones al puerto TCP dado o al socket Unix en el host remoto (servidor) se deben reenviar al host y al puerto dados, o al socket Unix, en el lado local.fuente
scp
de C, aunque B, a A, puede hacerloA$ scp -oProxyJump=B C:destination thefile
.Las versiones de scp de principios de 2011 y posteriores pueden tener una opción "-3":
Si tiene esto, simplemente puede ejecutar:
fuente
Casi todo ya se ha dicho, pero aquí está mi último centavo: uso la variante ProxyCommand sin
nc
nisoc
. Basado en OpenSSH Proxies y Jumphost Cookbook, diseñé la siguiente configuración:Entonces tenemos los siguientes jugadores:
En primer lugar he añadido mi clave pública local desde mi anfitrión casa
.ssh/id_dsa.pub
a.ssh/authorized_keys
en ambos anfitriones hop y de destino. Sí, la misma clave pública del host principal para ambos. Por lo general, esperaría que sea la clave pública HOP la que tiene que agregar a la OBJETIVO.Luego modifiqué
.ssh/config
un poco agregando la siguiente entrada:Después de que la operación de copia es tan simple como:
scp FILE TARGET_HOST:
. Muestra pancartas dobles de los nodos de salto y de destino, pero funciona.Por supuesto que puede usar encima de ssh directamente en el destino:
ssh TARGET_HOST
. Funciona con scp y ssh.Otra opción más general podría ser la utilidad sshuttle , que parece ser una especie de proxy transparente (vpn sobre ssh). Entonces, en su caso de A-> B <-> C, permite conectarse a cada nodo en la red de C: A-> B- [CDEFG]. No necesita administrador, pero requiere Python 2.7 (3.5 también está bien), que no siempre es lo que tenemos. Vale la pena intentarlo.
fuente
en otro caparazón:
Esto está utilizando el reenvío de puertos. La única limitación aquí es que el host B debe configurarse para permitir el reenvío de puertos. De lo contrario, esto debería funcionar bien.
A modo de explicación,
-L
y le-R
permite reenviar puertos. En-L
, el primer puerto dado es el puerto ssh comenzará a escuchar en la máquina de origen (host A), y reenviará todo lo que reciba en ese puerto a través de su conexión SSH al host B, luego se enrutará al host C en el puerto 22.editar
Me equivoqué un poco la sintaxis. Configura un reenvío en su máquina LOCAL.
fuente
La respuesta de ProxyCommand de Grawity funcionó para mí, pero como estoy menos familiarizado con SSH, me llevó un poco de experimentación. Pensé que simplemente explicaría la respuesta de Grawity con más detalle para ayudar a cualquier otro novato a SSH como yo. Aquí están las definiciones para una notación más explícita:
Máquina A: la máquina en la que estás
Servidor B: [email protected] (el servidor principal o el servidor intermedio)
Servidor C: [email protected] (el servidor remoto al que desea copiar)
ProxyCommnad
Ejemplo concreto
Entonces, para un ejemplo concreto, supongamos que tiene acceso a un servidor con IP
0.0.1.2
con una cuenta de usuario llamadabar
(Servidor C). Pero para llegar a él, primero debe iniciar sesión en un servidor con IP0.0.1.1
con una cuenta de usuario llamadafoo
(Servidor B). Ahora desea copiar el archivobaz.txt
ubicado en su equipo actual (la máquina A) al servidor0.0.1.2
's/home/bar/
directorio. Para usar el ProxyCommand anterior para este ejemplo, debe ejecutar lo siguiente:También puede copiar fácilmente un archivo desde el Servidor C cambiando el orden del archivo y el destino. Entonces, por ejemplo, si
baz.txt
ya estaba en el servidor0.0.1.2
ubicado en,/home/bar/
entonces podría copiarlo a su máquina usando:Espero que esto ayude a las personas que necesitan explicarse un poco más que otros.
fuente