¿Cómo SCP un archivo a través de un servidor intermedio?


15

Estoy usando Ccygwin en WinXP (con el shell bash). Quiero SCP un archivo de mi host local a una máquina remota: host2. Sin embargo, solo puedo SSH a una máquina intermedia: host1, y luego desde SSH a host2. (Nota, no puedo acceder a host2 desde mi host local).

Pensé que hacer túneles era mi respuesta, pero cuando trato de instalar un túnel

ssh -L 9999:localhost:9998 dalvarado@host1 'ssh -L 9998:localhost:1234 -N dalvarado@host2'

Pero después de escribir este comando y presionar enter, el sistema simplemente se cuelga. ¿Cuál es la forma correcta de configurar un túnel y luego SCP un archivo después?

Gracias, -


2
Duplicado de superuser.com/questions/174160/… - vea mi respuesta a continuación para obtener un resumen.
jmetz

Del usuario Meir D : Consulte también serverfault.com/questions/337274/…
fixer1234

Respuestas:


17

Esto ya ha sido respondido mejor aquí .

Para resumir: ponga lo siguiente en ~/.ssh/config

Host target.machine
User          targetuser
HostName      target.machine
ProxyCommand  ssh proxyuser@proxy.machine nc %h %p 2> /dev/null

y luego simplemente scpa target.machine en cualquier momento que desee proxy a través de proxy.machine!

También funciona para ssh, por lo que también le ahorrará tiempo en la máquina de destino.

El crédito debe ir al usuario 24925 que respondió esto en 2011.


13

Para configurar un túnel SSH, use el siguiente formato:

ssh -L 9999:host2:22 user@host1

Este comando se conecta a host1as usery hace un túnel al puerto 9999 en la computadora que emite el comando al puerto 22 host2. -Nes opcional, o puede usar algo como topo watchpara mantener viva la sesión si es necesario.

Luego, simplemente scpa host2 en localhost: 9999.


1
Cuando ejecuto este comando, ¿debo terminar iniciando sesión en host1? Además, después de ejecutar este comando, abrí otro shell bash y ejecuté "scp hello.txt localhost: 9999", pero obtuve un error "ssh: connect to host localhost port 22: Connection rechaced". ¿Qué estoy haciendo mal aquí?
Dave

3
Cuando ejecute este comando, se conectará a host1, sí. Sin scpembargo, la sintaxis de su comando es incorrecta. Pruebe aquí scp -P 9999 hello.txt user@localhost:/path/to/destination/filedónde userestá el usuario en el host2que desea iniciar sesión.
Lluvia el

1
@Rain, podrías poner este ejemplo en la respuesta principal;)
dmeu

5

Desde OpenSSH 7.3 , puede usar -Jo -o ProxyJumpespecificar el servidor bastion / jump. Por lo tanto, a SSH a node2través de node1:

ssh -J you@node1 you@node2

SCP no tiene el -Jargumento, pero sí lo permite -o, así que esto funciona:

scp -o ProxyJump=you@node1 file.txt you@node2:~

3

Primero puede scp el archivo a host1, así:

scp file dalvarado@host1:.

Luego haga esto para llevarlo a host2:

ssh -t dalvarado@host1 'scp file dalvarado@host2:.'

La -topción lo sshobliga a asignar un pseudo-terminal, lo que puede facilitar que scpel host1 le solicite una frase de contraseña / contraseña. Si tiene ssh-agent ejecutándose y configurado en todas partes, no se le debe solicitar una frase de contraseña / contraseña.

Ofrezco esta alternativa, porque si usaras un túnel, aún necesitarías dos comandos: uno para configurar el túnel y otro para copiar el archivo a través de él. Esto parece más simple.


Fantástica solución !!!
Riccardo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.