scp entre dos hosts remotos desde mi (tercera) pc

136

Tengo dos hosts remotos.
host1-> 10.3.0.1
host2-> 10.3.0.2
Ambos ejecutan un servidor ssh.

El servidor ssh escucha en el puerto 22 en host1 y en el puerto 6969 en host2. Ahora, usando mi máquina local, necesito copiar algo de host1 a host2 sin iniciar sesión en host1 o host2 a través de ssh. Algo como,

scp [email protected]:/path/to/file [email protected]/path/to/file

¿Cómo puedo hacer esto? Tenga en cuenta que los dos hosts usan puertos diferentes para ssh.

uwais ibrahim
fuente
¿Pregunta si puede transferir de un host remoto a un host remoto o pregunta cómo hacerlo sin tener que proporcionar una contraseña?
Glenn Jackman
Si bien el -Pindicador existe para especificar el puerto a utilizar, en caso de transferencia de remoto a remoto, ssh no tiene un comportamiento definido sobre cómo especificar el puerto por host ...
mveroone

Respuestas:

216

En el pasado, la forma en que scpfuncionaba, cuando se le llamaba ( ingenuamente ) para copiar archivos entre sistemas remotos, era muy inconveniente: si escribía, por ejemplo

    scp user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

scpprimero abriría una sshsesión en remote1, y luego se ejecutaría scpdesde allí a remote2. Para que esto funcione, tendría que configurar las credenciales de autorización para remote2 en remote1.

La forma moderna de hacerlo, en cambio, ("moderna" porque se implementó hace solo unos años, y tal vez no todos tienen -3capacidad scp) requiere dos pasos. El primer paso necesario es usar ~/.ssh/configpara configurar todas las opciones para la conexión a remoto1 y remoto2, de la siguiente manera:

    Host remote1.example.org
    Port 2222
    IdentityFile /path/to/host1-id_rsa

    Host remote2.example.org
    Port 6969
    IdentityFile /path/to/host2-id_rsa

De esta manera, es posible pasar todas las opciones necesarias al comando sin ambigüedades : por ejemplo, si hubiéramos dicho en la CLI que use el puerto 2222 sin la configuración anterior, no habría estado claro si nos referíamos a remoto1 o remoto2 , y igualmente para el archivo que contiene las claves criptográficas. De esta manera, la CLI se mantiene ordenada y simple.

En segundo lugar, use la -3opción, como sigue:

    scp -3 user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

La -3opción da instrucciones scppara enrutar el tráfico a través de la PC en la que se emite el comando, aunque sea un tercero en la transferencia. De esta manera, las credenciales de autorización deben residir solo en la PC emisora, el tercero.

MariusMatutiae
fuente
66
Para referencia futura: si copia un archivo entre dos hosts que comparten un archivo de identidad (como una instancia EC2), entonces no necesita el archivo de configuración. Un argumento -i es suficiente para conectarse a ambos hosts.
Artur Czajka
1
También vale la pena señalar, para Google Compute Engine, hay soporte para agregar a su ~/.ssh/configarchivo: cloud.google.com/compute/docs/gcloud-compute, pero no creo que AWS tenga el mismo soporte
modulitos
1
Como no verá la salida como lo hace normalmente, un consejo es habilitar el modo detallado con -v.
holmberd
6

La última vez que probé esto, scp no pudo hacer eso. Su línea de comando se ve bien. Esta solución funcionará:

ssh -p port_on_machine1 user@machine1 "cat /path/to/file/one"|ssh -p port_on_machine2 user@machine2 "cat >/path/to/file/two"
usuario259412
fuente
mi página de manual de scp dice "También se permiten copias entre dos hosts remotos".
Glenn Jackman
1
Gracias, es bueno escucharlo. Para scp, puede dar un indicador -P (fue escrito por algunas personas BSD, esto porque su manejo de argumentos es muy trágico :-(), pero parece que no puede especificar diferentes puertos en los hosts remotos. Lo siento, pero creo que, sólo que esta solución izquierdas (o hay un montón de soluciones más difíciles, usando ssh pero evitando SCP - por ejemplo, sftpfs, pero no son los más sencillos). extendí la solución con la configuración del puerto.
user259412
4

En mi caso, estaba haciendo una copia remota a remota, sin el -3argumento. El puerto proporcionado con el parámetro '-P' funciona con el primer servidor, pero el puerto 22 se usa con el segundo.

ssh -P 1234 [email protected] [email protected]

La solución es editar el /etc/ssh/ssh_configarchivo server1y agregar estas líneas:

Host *.otherdomain.com
   Port  1234

De esta manera, el puerto 1234 se usa para ambos. Podría ser diferente también.

Esta solución tiene un mejor rendimiento que las soluciones anteriores, porque la comunicación es directa.

david.perez
fuente
Pérez, ¿hay alguna manera de lograr scp a través de dos puertos diferentes para las dos máquinas remotas diferentes de la línea de comando?
Botella roja
4

El origen y el destino pueden especificarse como un URI en la forma scp: // [usuario @] host [: puerto] [/ ruta]

para que puedas ejecutar:

scp -3 scp://[email protected]:22/path/to/file scp://[email protected]:6969/path/to/file
molabib
fuente