Scp sobre un proxy con un comando de la máquina local?

54

Tengo mi local.machine, proxy.machine y target.machine. local.machine no tiene contacto directo con target.machine, pero necesita pasar por proxy.machine.

Quiero scp un archivo de target.machine a local.machine. ¿Es esto posible hacer con un solo comando de local.machine?

grm
fuente

Respuestas:

64

Sé que esta es una respuesta tardía, pero acabo de encontrar una forma genial de hacerlo. Básicamente es la respuesta de Holger Just, pero en un archivo de configuración guardado:

~/.ssh/configDebe poner esto en su archivo en local.machine, (creando el archivo si no existe)

Host target.machine
  User          targetuser
  HostName      target.machine
  ProxyCommand  ssh [email protected] nc %h %p 2> /dev/null

Después de guardar el archivo, puede usar

ssh target.machine

cuando quieras conectarte. Scp también funcionará, ya que también respeta el archivo de configuración ssh. También lo hará Nautilus, si estás usando GNOME y quieres usar una GUI.

user24925
fuente
55
Solo una nota rapida. Si está utilizando un archivo de identidad alternativo a través de la opción de línea de comando -i para ssh, debe especificar esa opción para la configuración de ProxyCommand y la línea de comando ssh.
BillMan
77
3 cosas que podrían ayudar, 1) ayudaría si también mostrara las Host proxy.machinelíneas en el mismo ~/.ssh/configarchivo, 2) Mencione si estos comandos pueden anidarse (es decir, el cliente se conecta al servidor proxy 1 que se conecta al servidor proxy 2 al que se conecta). ..target) y 3) qué nc %h %psignifica
puk
¿Cómo podemos copiar de la máquina local a la máquina de destino con proxy?
Mulagala
19

Puede hacerlo con un comando, pero necesita instalar netcat (nc) en la máquina proxy:

ssh -o "ProxyCommand ssh [email protected] nc -w 1 %h 22" [email protected]

[EDITAR: mezclado el orden de las máquinas ...]

Holger Just
fuente
Buen intento, pero ¿dónde debo agregar el nombre de usuario para proxy y para iniciar sesión?
grm
Jzst antes de los nombres de las máquinas, con una @. Edité mi respuesta para reflejar eso.
Holger Just
19

Ahora puede * hacer esto como una sola línea, sin requerir nc ningún lugar:

scp -o "ProxyCommand ssh [email protected] -W %h:%p" [email protected]:file .

Explicación

pcredsy tcredsrepresentar a su proxy y de destino credenciales si es necesario ( username, username:password, etc.).

Esto es posible debido a una capacidad de tipo netcat incorporada, que elimina el requisito para ncel host intermedio. El uso ssh -W host:portconfigura un túnel para el host y el puerto especificados y lo conecta a stdin / stdout, y luego se scpejecuta sobre el túnel.

Los %hy %pen ProxyCommandse reemplazan con el host de destino y el puerto que especifique.

Para una mayor conveniencia, puede configurar el proxy en su configuración ssh:

Host target.machine
    ProxyCommand ssh [email protected] -W %h:%p

y a partir de entonces solo haz

scp [email protected]:file .

* desde OpenSSH 5.4 - lanzado en marzo de 2010

CupawnTae
fuente
1
Verificado, esto funciona bien y no deja procesos NC obsoletos en la máquina proxy.
LaXDragon
1
¿Dónde puedo especificar el puerto del proxy?
Marcado el
1
@Marged No estoy en condiciones de probarlo aquí en este momento, pero creo que deberías poder incluir -p <portnum>antes -Wde cualquiera de los métodos para especificar el puerto proxy
CupawnTae
1
Me tomó un tiempo descubrir que la opción -i (si la necesita) va dentro de las comillas. El proxy ssh no usa por defecto la misma clave privada especificada por ninguna opción -i suministrada directamente a scp. Supongo que es obvio cuando lo piensas.
Keeely
18

Si no le importa usar rsync en lugar de scp, puede usar el siguiente one-liner:

rsync -v --rsh "ssh proxy.machine ssh" target.machine:/remote/file /local/dir/

(necesitará acceso sin contraseña a la máquina proxy)

dubek
fuente
8
$ ssh -f -N -L <localport>:<target.machine:port> [email protected]
$ scp [email protected]:/remote/file -P <localport> .

OK, en realidad dos comandos ...

weeheavy
fuente
1
¿Cómo puedo especificar el puerto de mi proxy? En mi caso8080
Marcado el
@Marged agrega -p <portnumber>a tu comando ssh
weeheavy
6

¿Una frase? No fuera de mi cabeza. Primero debe establecer un proxy y no puede hacerlo con scp por sí mismo.

Al hacerlo manualmente, abro una sesión de pantalla para mi túnel:

screen -S tunnel

La pantalla se usa para mantener el túnel en marcha en una capa de fondo. Use cualquier técnica que desee para mantener el túnel abierto en el fondo (la respuesta de @ weeheavy es probablemente la más simple). Una vez en la sesión de pantalla comienzo mi túnel así

ssh -L 2222:target.machine:22 [user@]proxy.machine

Para desglosar eso, eso básicamente dice "En mi máquina local, abra el puerto 2222 y cualquier conexión que golpee localhost: 2222 se representa a través de proxy.machine a target.machine: 22"

Una vez que haya establecido la conexión ssh y el túnel, desconecte de la sesión de pantalla con "Ca d". Para volver a esa sesión de pantalla, escribascreen -raAd tunnel

Una vez que esté de vuelta en su shell original, su comando scp se verá como

scp -P 2222 localhost:your/file/on/target.machine local/path

Recuerde que el puerto localhost 2222 es realmente solo un túnel que va a target.machine.

Whaley
fuente
3

Parece que scp admite la opción "-o" al igual que ssh, aunque no estoy seguro de cómo pasarle un nombre de usuario / contraseña proxy:

scp -o "ProxyCommand=nc -X connect -x proxyhost:proxyport %h %p" remote_user@remote_host:remote_path local_path

Si obtiene nc: invalid option -- Xver https://stackoverflow.com/a/23616021/32453

rogerdpack
fuente
dope bro, trabajó inmediatamente :)
Elouan Keryell-Even
1

Podrías probar algo como:

ssh [email protected] "ssh [email protected] 'cat > file'" < file

Pero no funcionará si su proxy.machine necesita pedirle una contraseña (ese SSH no está en un TTY, por lo que askpass fallará).

Si tiene más de un archivo, puede usar tar de esta manera (sin probar, generalmente uso un netcat de esa manera):

tar cf - file1 file2 folder1/ | ssh [email protected] "ssh [email protected] 'tar xvf -'"
Eric Darchis
fuente
1

Otra solución simple para transferir un archivo source_host desde source_host a destination_host a través de proxy_host :

Inicie sesión en el servidor proxy :

ssh login@proxy_host

Desde el servidor proxy, transfiera el archivo de origen del host de origen al host de destino (puede escribir esto como una línea, omitiendo \o como dos líneas, como se muestra a continuación):

scp login@source_host:/path_to_source_file \
  login@destination_host:/path_to_destination_directory

Esto requiere que el inicio de sesión en source_host a proxy_host use una rsa_key.

lomai
fuente
0

En caso de que necesite usar claves públicas, necesitará algo como esto.

Host target-machine
  User          target-user
  HostName      target.example.com
  IdentityFile  /path/to/file.pem
  ProxyCommand  ssh bastion -W %h:%p

Host bastion
  User         bastion-user
  HostName     bastion.example.com
  IdentityFile /path/to/file.pem
León
fuente
0

Seguí este artículo y encontré una respuesta que me funciona. (Porque las respuestas anteriores no funcionan para mí).

Cómo hacer scpun archivo a través de un host intermedio (también conocido como host de salto) http://mperdikeas.github.io/networking.html.files/scp-a-file-through-jump-host.html

Y mi respuesta es la siguiente:

scp -oProxyCommand="ssh -W %h:%p {username}@{proxy_IP}" \
        {source_file} {remote_username}@{remote_IP}:{remote_file_path}

Ejemplo:

scp -oProxyCommand="ssh -W %h:%p [email protected]" \
        archive.gz [email protected]:/home/wise/archive.gz

Espero que esta respuesta te pueda ayudar.

Wise Lin
fuente