transferir servidores servidor puerto por password entre copiar consola comando archivos scp

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.