Pregunta ¿Cómo hago las transferencias Multihop SCP?


Quiero copiar un archivo de mi máquina A al servidor C, pero solo tengo acceso al servidor C a través del servidor B.

En lugar de transferir primero al servidor B, inicie sesión y luego transfiera al servidor C, ¿es posible transferir el archivo directamente con SCP o programas similares?

(El modo tramp de Emacs tiene esta característica para editar archivos de forma remota).


76
2017-07-08 12:09


origen




Respuestas:


Asumiendo OpenSSH, agregue a su configuración SSH en .ssh / config

Host distant
ProxyCommand ssh near nc distant 22

Esto hará que SSH pueda conectarse "directamente" a la máquina llamada distante mediante el proxy a través de la máquina llamada cerca. Luego puede usar aplicaciones como scp y sftp para la máquina distante.

Para que esto funcione, necesita 'nc' aka netcat instalado en la máquina llamada near. Pero muchos sistemas modernos ya lo tendrán.

La solución tar de towo es más efectiva para problemas de un solo disparo, siempre que haya memorizado la sintaxis y las reglas de operación de tar.


43
2017-07-08 12:25



Este es el mismo método que utilizo ... En este ejemplo, 'distante' sería el servidor C y 'cerca' sería el servidor B para aclarar ... - Jeremy Bouse
Muchas máquinas modernas no tienen 'nc': normalmente está disponible solo para máquinas Linux y solo a pedido (no es parte de la instalación estándar). - Mei
ssh tiene ahora la opción -W, que lo hace automáticamente sin 'nc', pero me pregunto por qué no hay scp -W - kubanczyk
En caso de que no sea el único, esto no era obvio: si el nombre de usuario en near es diferente del nombre de usuario en distant, el usuario cercano entra en ProxyCommand ssh nearuser@near..., y el usuario distante entra en un separado User distantuser línea. - Mu Mind
Simplemente escriba ssh multi hope y presione Google. Me siento afortunado. - chandank


Puedes añadir -o opciones para scp en lugar de .ssh/config.

scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path

$jump_host es su "servidor B" en este caso.


41
2018-01-11 17:30



Esta es mi forma preferida de hacer esto. Deshacerte de .ssh / config para multihopping no es la mejor solución si accedes al mismo host, ya sea directamente desde una puerta de enlace. - GabrieleV
gran fragmento ... Gracias ... - Paul T.
¿Cómo sería esto con diferentes nombres de usuario y puertos personalizados? - Pablo Bianchi


Con las versiones más recientes de ssh en el servidor cerca de la máquina (B), lo siguiente funcionará sin netcat:

Host distant
    ProxyCommand ssh near -W distant:22

Sin embargo, requerirá que AllowTcpForwarding sea yes (el valor predeterminado) en la máquina cercana (B)

edición: requiere OpenSSH 5.4+ en B


19
2018-03-20 01:04



Funciona de maravilla :) - gongzhitaao
Y a partir de OpenSSH 7.4p1 como mínimo, hay un comando "ProxyJump" en el que uno solo tiene que listar cada usuario @ host: puerto separado con comas. ¡Bonito! - hmijail
ProxyJump es bueno, pero no tomó el Usuario y el Archivo de Identidad del archivo de configuración. ProxyCommand -W hace esto y también funciona con scp. - rickfoosusa


Puedes ssh al servidor B usando algo como

ssh -L 5022:<server C IP>:22 <user_serverB>@<server B IP>

Entonces puedes ssh al servidor C usando

ssh -p 5022 <user_serverC>@localhost 

Similarmente scp funcionaría usando

scp -P 5022 foo.txt <user_serverc>@localhost:

Recuerda usar el caso correcto de p con scp y ssh


15
2017-07-08 13:02





Si quieres ser realmente malvado, podrías encadenar ssh y tar, algo como tar c mydir | ssh server "ssh otherserver | tar x", pero esto puede correr en todas las manos de problemas.

La forma más sencilla sería configurar un túnel SSH con los métodos incorporados de SSH; mira el -D cambie en la página de manual y simplemente reenvíe algún puerto al puerto ssh del otro servidor.


3
2017-07-08 12:16





Es posible y relativamente fácil, incluso cuando necesita utilizar certificados para la autenticación (típico en los entornos de AWS).

El siguiente comando copiará los archivos de un remotePath en server2 directamente en su máquina en localPath. Internamente, la solicitud de scp se procesa a través de server1.

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

La otra forma también funciona (subir archivo):

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>

Si utiliza la autenticación de contraseña en su lugar, intente con

scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

Si usa las mismas credenciales de usuario en ambos servidores:

scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>

2
2017-10-08 01:24





También puedes hacer esto a la inversa y quizás sea más fácil.

Suponiendo que tiene una sesión ssh abierta con la máquina a la que desea enviar el archivo. Esta PC de salto más lejano, la llamaremos hop2. Tu host "proxy" será hop1. La PC que es origen de archivo, la llamaremos origen.

origin:~/asdf.txt  --> hop1 --> hop2:~/asdf.txt

Puede construir túneles haciendo que un puerto local esté disponible en una PC remota. Por lo tanto, estamos definiendo un puerto para abrir en la PC remota, que será una redirección al puerto que detuviste contigo cuando construiste el túnel.

En hop2:

ssh -R 5555:127.0.0.1:22 <hop1_user>@<hop1_IP>
#this has the effect of building a tunnel from hop2 to hop1, making hop2's port 22 available on hop1 as port 5555

Ahora, en esa sesión abierta del túnel, puede hacer lo mismo desde hop1 hasta file_origin.

En hop1:

ssh -R 6666:127.0.0.1:5555 <origin_user>@<origin_IP>
#this has the effect of building a tunnel from hop1 to origin while also pulling the active tunnel with it, making hop1's port 5555 (hop2's port 22) available on origin as port 6666.

Ahora está en un túnel desde hop2 a hop1 hasta el origen. Casualmente, ahora tanto el puerto 5555 como el 6666 están abiertos en el origen, los cuales son redireccionados al puerto 22 de hop2. Dentro de esta sesión, las dos siguientes son rutas scp válidas hacia el salto2:

En origen:

scp -P 6666 ~/asdf.txt <hop2_user>@<127.0.0.1>:~/asdf.txt

De esta manera, puede tener un número arbitrario de saltos intermedios, y es más fácil trabajar en términos de encadenar más de dos saltos.


2
2017-11-18 20:22





Intente adaptar el siguiente ejemplo de configuración de openssh para una configuración que se puede usar para varios hosts:

Host uat-*
     ProxyCommand ssh bastion-uat nc %h %p

Esto supone un conjunto de servidores que comienzan con "uat-" a los que solo se puede acceder a través del servidor de buzones / pasarelas "bastion-uat". Probablemente también quieras agregar ForwardAgent yes Si está utilizando una clave para iniciar sesión.


1
2018-06-25 10:33



No usar ForwardAgent yes para esto. El reenvío de agentes no es necesario en este caso porque no se ejecutará ningún cliente ssh en el bastión, y reenviar un agente cuando no es necesario solo reducirá la seguridad. Y yo pienso ssh Falta de su comando. Si un reciente ssh Se está utilizando la versión que no necesita nc, puedes escribir ssh -W %h:%p bastion-uat en lugar. - kasperd
@kasperd Editado para incluir ssh. Re ForwardAgent; se ejecutará un cliente ssh para ejecutar el comando nc en sí. ¿Quizás te refieres a la concha? - Benjamin Goodacre


Esto no es scp (que OP solicitó), pero lo encontré muy simple de usar rsync para copiar de local a remoto en un solo salto con:

rsync -v -e 'ssh -A -t user@jumpserver ssh -A -t user@destinationserver' /path/to/sourcefile :/path/to/destination

Fuente: http://mjbright.blogspot.com/2012/09/using-rsync-over-multi-hop-ssh.html

Había intentado la sugerencia de -o ProxyPass arriba y no quería cambiar la configuración para mis necesidades cambiantes. Como indica el autor en el enlace anterior, el archivo de destino que precede los dos puntos (:) es importante para indicar que la ruta especificada está en el servidor de destino. Además, usando rsync, tiene las opciones de comparación de fechas, sincronización de carpetas, etc. ¡Espero que esto ayude a alguien!


1
2017-12-21 17:07