¿Cómo puedo descargar un archivo de un host al que solo puedo enviar SSH a través de otro host?


30

Quiero descargar archivos de la computadora de mi oficina a mi computadora portátil.

Puedo conectar mi máquina de oficina por SSH al servidor de la organización y luego SSH desde el servidor a mi máquina de oficina.

Los únicos comandos que acepta el servidor de la organización son ssh, ssh1 y ssh2.

¿Cómo puedo descargar un archivo de mi máquina de oficina (remota) a través del servidor en mi computadora portátil (local)?


2
¿Usar túneles SSH inversos? Vea mi respuesta aquí y adáptela según sea necesario: superuser.com/questions/1186905/…
Darren

1
multi-hop SSH?
mckenzm

Respuestas:


37

Las respuestas anteriores mencionan cómo usar la directiva ProxyJump (agregada en OpenSSH 7.3) para conectarse a través de un servidor intermedio (generalmente denominado host de bastión), pero lo mencionan solo como un argumento de línea de comando.

A menos que sea una máquina a la que no se conectará en el futuro, lo mejor es que la configure ~/.ssh/config.

Pondría un archivo como:

Host office-machine
Hostname yochay-machine.internal.company.local
ProxyJump bastion-machine

Host bastion-machine
Hostname organization-server.company.com
...

Si está utilizando una versión anterior de OpenSSH que no es compatible con ProxyJump, la reemplazaría con el equivalente:

ProxyCommand ssh -W %h:%p bastion-machine

y si su versión ssh local era realmente antigua y no era compatible -W:

ssh bastion-machine nc %h %p

aunque este último requiere que la máquina de bastión esté ncinstalada.

La belleza de ssh es que puede configurar cada destino en el archivo, y se apilarán muy bien. Por lo tanto, terminas trabajando office-machinecomo el nombre de host en todas las herramientas (ssh, scp, sftp ...) ya que eran conexiones directas y descubrirán cómo conectarse en función de ssh_config. También podría tener comodines Host *.internal.company.localpara hacer que todos los hosts que terminen así pasen por un bastión específico, y se aplicará a todos ellos. Una vez configurado correctamente, la única diferencia entre hacer conexiones de un salto o veinte sería los tiempos de conexión más lentos.


36

Si tiene un OpenSSH reciente (8.0), puede usar el -Jinterruptor (salto) :

scp -J user@intermediate user@target:/path

Con versiones anteriores (pero al menos 7.3), puede usar la ProxyJumpdirectiva , ya sea en la línea de comandos:

scp -o ProxyJump=user@intermediate user@target:/path

o en el ssh_configarchivo, como lo muestra la respuesta de @ Ángel.


Existen otras opciones, como el ProxyCommandreenvío de puertos, que puede usar incluso en versiones anteriores de OpenSSH. Estos están cubiertos en ¿OpenSSH admite el inicio de sesión en múltiples tiendas?


2
@yochaymaganssh -J userA@orgserv userB@officecomp cat remote/path > local/path
mosvy

44
Para scp, se agregó en 7.10
Ángel

44
Incluso si scpno es compatible -J, podría ser lo suficientemente nuevo como para admitir la ProxyJumpopción; pruebe una de las otras respuestas que usan esta opción explícitamente.
Gordon Davisson

2
Esta debería ser la respuesta aceptada. Desprecio todas las respuestas a las sshpreguntas que sugieren modificar su configpara hosts específicos cuando una simple opción de línea de comando es suficiente para hacer el trabajo.
clemisch

2
"Despreciar" parece una reacción extrema. Claro, hay casos en los que una modificación rápida de la línea de comando es más fácil que tener que modificar primero el archivo de configuración. Pero si planea conectarse al mismo host varias veces, seguramente preferiría actualizar mi archivo de configuración una vez que usarlo -J user@intermediatecada vez que necesite conectarme.
chepner

10

A veces podemos usar la tubería. Ese tiempo es hoy.

ssh -A user@host1 ssh user@host2 cat filename > filename

También puedes subir

ssh -A user@host1 ssh user@host2 cat \\\> filename < filename

Sí, hay otras soluciones que implican representación, etc., pero saber cómo hacerlo es útil.


Uso útil de cat!
Piskvor

Tenga en cuenta que esto le da a cualquier usuario suficientemente privilegiado del host intermedio acceso a su agente y claves ssh. Los datos que fluyen entre su host y host2 también existirán sin cifrar en host1. Los métodos que usan proxies y saltan arriba evitan ambos problemas.
James

@james: no estoy inconsciente. Los hosts de bastión como estos suelen ser muy confiables.
Joshua

7

Usa la ProxyJumpconfiguración:

ProxyJump
Especifica uno o más servidores proxy de salto como [usuario @] host [: puerto] o un URI ssh. Múltiples proxies pueden estar separados por comas y serán visitados secuencialmente. Establecer esta opción hará que ssh (1) se conecte al host de destino haciendo primero una conexión ssh (1) al host ProxyJump especificado y luego estableciendo un reenvío TCP al destino final desde allí.

scp -o ProxyJump=user@intermediate user@target:/path

2

Existe un antiguo protocolo llamado ZMODEM : pocos programas lo admiten en estos días, pero cuando funciona, puede ser bastante conveniente.

Primero verifique si el programa de terminal de su computadora portátil admite ZMODEM. (Por ejemplo, puede configurar iTerm2 (en Mac) para admitir ZMODEM. Un script de ejemplo está disponible aquí ).

En su máquina de oficina, ejecute: sudo apt install lrzsz

Ahora todo lo que tiene que hacer es ssh a su máquina de oficina y ejecutar sz (filename). El archivo se descargará a través de su terminal.


1

Configuración bajo ssh del usuario: ~/.ssh/config

Host *
    UserKnownHostsFile=/dev/null
    StrictHostKeyChecking=no
    ServerAliveInterval 300
    ServerAliveCountMax 2
    ForwardAgent yes


Host jump server
    HostName server.company.org
    User root

Host jump1 server1
    HostName server1.dmz.company.org
    User root
    ProxyJump jump

Host jump2 server2
    HostName server.dmz2.company.org
    User root
    ProxyJump jump1

Host *.intranet.company.org
    User user
    ProxyJump jump2

Puede copiar ahora desde el servidor de intranet directamente sobre 3 servidores de salto.

scp user@server.intranet.company:/home/user/ ./*

Prefiero esto porque ya no necesito especificar servidores de salto con scp


0

Vía SCP -3:

scp -3 user1@remote1:/root/file1.txt user2@remote2:/root/file1.txt

2
La -3opción se describe como "Las copias entre dos hosts remotos se transfieren a través del host local". Si bien creo que esta pregunta estipula que el host local no podría acceder a "remote2".
Jeff Schaller

2
@JeffSchaller: te conectas a la máquina en el medio y luego la usas -3. Pero esto supone que puede conectarse desde la máquina del medio a la primera.
Joe

No veo ninguna ventaja de esto sobre -J / JumpHost. Por el contrario, ya que tiene la limitación que @Joe menciona.
Martin Prikryl
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.