Cómo scp con un segundo host remoto


Me pregunto si hay una manera para mí de SCP el archivo desde el host remote2 directamente desde mi máquina local pasando por un host remote1.

Las redes solo permiten conexiones a host remote2 desde host remote1. Además, ni el host remote1 ni el host remote2 pueden scp a mi máquina local.

Hay algo como:

scp user1@remote1:user2@remote2:file .

Primera ventana: ssh remote1, luego scp remot2:file ..

Segundo shell: scp remote1:file .

Primera ventana: rm file; logout

Podría escribir un script para hacer todos estos pasos, pero si hay una forma directa, prefiero usarlo.

Gracias.

EDIT: Estoy pensando en algo como abrir túneles SSH, pero estoy confundido sobre qué valor poner dónde.

En este momento, para acceder a remote1, tengo lo siguiente en $HOME/.ssh/config en mi máquina local.

Host remote1
   User     user1
   Hostname localhost
   Port     45678

Una vez en remote1, para acceder a remote2, es el DNS local estándar y el puerto 22. ¿Qué debo poner en remote1 y/o cambiar en localhost?

 61
scp
Author: TML, 2012-02-04

4 answers

No conozco ninguna forma de copiar el archivo directamente en un solo comando, pero si puede conceder la ejecución de una instancia SSH en segundo plano para mantener un túnel de reenvío de puertos abierto, entonces podría copiar el archivo en un comando.

Así:

# First, open the tunnel
ssh -L 1234:remote2:22 -p 45678 user1@remote1
# Then, use the tunnel to copy the file directly from remote2
scp -P 1234 user2@localhost:file .

Tenga en cuenta que se conecta como user2@localhost en el comando scp real, porque es en el puerto 1234 en localhost que la primera instancia ssh está escuchando conexiones reenviadas a remote2. Tenga en cuenta también que no es necesario ejecutar el primer comando para cada copia de archivo posterior; simplemente puede dejarlo en ejecución.

 84
Author: Dolda2000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-08 19:12:26

Doble ssh

Incluso en su caso complejo, puede manejar la transferencia de archivos utilizando una sola línea de comandos, simplemente con ssh ;-)
Y esto es útil si remote1 no puede conectarse a localhost:

ssh user1@remote1 'ssh user2@remote2 "cat file"' > file

tar

Pero pierde propiedades de archivo (propiedad, permisos...).

Sin embargo, tar es su amigo para mantener estas propiedades de archivo:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar c file"' | tar x

También puede comprimir para reducir el ancho de banda de la red:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj file"' | tar xj

Y tar también le permite transferir un directorio recursivo a través de basic ssh:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj ."' | tar xj

ionice

Si el archivo es enorme y no desea molestar a otras aplicaciones de red importantes, puede perder la limitación de rendimiento de red proporcionada por las herramientas scp y rsync (por ejemplo, scp -l 1024 user@remote:file no usa más de 1 Mbits/segundo).

Pero, una solución está utilizando ionice para mantener una sola línea de comandos:

ionice -c2 -n7 ssh u1@remote1 'ionice -c2 -n7 ssh u2@remote2 "cat file"' > file

Nota: ionice puede no estar disponible en el antiguo distribución.

 59
Author: olibre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-16 15:49:51

Esto hará el truco:

scp -o 'Host remote2' -o 'ProxyCommand ssh user@remote1 nc %h %p' user@remote2:path/to/file .

Para SCP el archivo desde el host remote2 directamente, agregue las dos opciones (Host y ProxyCommand) a su ~/.archivo ssh / config (ver también esta respuesta en el superusuario). Entonces puedes ejecutar:

scp user@remote2:path/to/file .

Desde su máquina local sin tener que pensar en remote1.

 28
Author: John Manak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-20 10:18:14

Con la versión openssh7.3 y arriba es fácil. Utilice la opción ProxyJump en el archivo de configuración.

# Add to ~/.ssh/config 
Host bastion
    Hostname bastion.client.com
    User userForBastion
    IdentityFile ~/.ssh/bastion.pem

Host appMachine
    Hostname appMachine.internal.com
    User bastion
    ProxyJump bastion                   # openssh 7.3 version new feature ProxyJump
    IdentityFile ~/.ssh/appMachine.pem. #no need to copy pem file to bastion host  

Comandos a ejecutar para iniciar sesión o copiar

ssh appMachine   # no need to specify any tunnel. 
scp helloWorld.txt appMachine:.   # copy without intermediate jumphost/bastion host copy.** 

Por supuesto, puede especificar el host de salto bastion usando la opción "-J" al comando ssh, si no está configurado en el archivo de configuración.

Nota scphace no parece apoyar la bandera "-J" a partir de ahora. (no pude encontrar en las páginas de manual. Sin embargo, arriba scp funciona con la configuración del archivo de configuración)

 2
Author: user3851404,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-22 07:39:39