servidores - Cómo scp con un segundo host remoto
scp ubuntu (4)
Me pregunto si hay una manera para que pueda SCP el archivo desde el host de remote2 directamente desde mi máquina local pasando por un host de remote1.
Las redes solo permiten conexiones al host remoto2 desde el host remoto1. Además, ni el host remoto1 ni el host remoto2 pueden copiarse en mi máquina local.
¿Hay algo como esto?
scp user1@remote1:user2@remote2:file .
Primera ventana: ssh remote1
, luego scp remot2:file .
.
Segundo shell: scp remote1:file .
Primera ventana: rm file; logout
rm file; logout
Podría escribir un guión para hacer todos estos pasos, pero si hay una manera directa, preferiría usarlo.
Gracias.
EDITAR: Estoy pensando en abrir túneles SSH, pero estoy confundido sobre qué valor colocar.
Por el 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 change en localhost
?
Doble ssh
Incluso en su caso complejo, puede manejar la transferencia de archivos usando una sola línea de comando, simplemente con ssh
;-)
Y esto es útil si remote1
no se puede conectar a localhost
:
ssh user1@remote1 ''ssh user2@remote2 "cat file"'' > file
tar
Pero pierde las propiedades del archivo (propiedad, permisos ...).
Sin embargo, tar
es tu 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 ssh
básico:
ssh user1@remote1 ''ssh user2@remote2 "cd path2; tar cj ."'' | tar xj
ionice
Si el archivo es enorme y no quiere molestar a otras aplicaciones de red importantes, puede pasar por alto la limitación de rendimiento de red proporcionada por las herramientas scp
y rsync
(p. Ej. scp -l 1024 user@remote:file
no utiliza más de 1 Mbits / second) .
Pero, una solución alternativa es usar ionice
para mantener una sola línea de comando:
ionice -c2 -n7 ssh u1@remote1 ''ionice -c2 -n7 ssh u2@remote2 "cat file"'' > file
Nota: ionice
puede no estar disponible en distribuciones antiguas.
Con openssh versión 7.3 y superior es fácil. Use 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 para 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 de bastión utilizando la opción "-J" al comando ssh, si no está configurado en el archivo de configuración.
Note que scp no parece soportar la bandera "-J" a partir de ahora. (No pude encontrar en las páginas man. Sin embargo, el scp anterior funciona con la configuración del archivo de configuración)
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 (vea también this respuesta en superusuario). Entonces puedes ejecutar:
scp user@remote2:path/to/file .
desde su máquina local sin tener que pensar en remote1
.
No conozco ninguna forma de copiar el archivo directamente en un solo comando, pero si puede aceptar ejecutar una instancia SSH en segundo plano para mantener abierto un túnel de reenvío de puerto, entonces podría copiar el archivo en un solo comando.
Me gusta esto:
# 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 está en el puerto 1234 en localhost que la primera instancia ssh
está escuchando reenviar conexiones a remote2
. Tenga en cuenta también que no necesita ejecutar el primer comando para cada copia de archivo posterior; simplemente puedes dejarlo funcionando.