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
?
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.
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.
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
.
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)
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