Respuestas:
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/config
Debe poner esto en su archivo en local.machine, (creando el archivo si no existe)
Host target.machine
User targetuser
HostName target.machine
ProxyCommand ssh proxyuser@proxy.machine 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.
Host proxy.machine
líneas en el mismo ~/.ssh/config
archivo, 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 %p
significa
Puede hacerlo con un comando, pero necesita instalar netcat (nc) en la máquina proxy:
ssh -o "ProxyCommand ssh poxyuser@proxy.machine nc -w 1 %h 22" targetuser@target.machine
[EDITAR: mezclado el orden de las máquinas ...]
Ahora puede * hacer esto como una sola línea, sin requerir nc
ningún lugar:
scp -o "ProxyCommand ssh pcreds@proxy.machine -W %h:%p" tcreds@target.machine:file .
Explicación
pcreds
y tcreds
representar 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 nc
el host intermedio. El uso ssh -W host:port
configura un túnel para el host y el puerto especificados y lo conecta a stdin / stdout, y luego se scp
ejecuta sobre el túnel.
Los %h
y %p
en ProxyCommand
se 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 pcreds@proxy.machine -W %h:%p
y a partir de entonces solo haz
scp tcreds@target.machine:file .
* desde OpenSSH 5.4 - lanzado en marzo de 2010
-p <portnum>
antes -W
de cualquiera de los métodos para especificar el puerto proxy
$ ssh -f -N -L <localport>:<target.machine:port> user@proxy.machine
$ scp target-user@local.machine:/remote/file -P <localport> .
OK, en realidad dos comandos ...
8080
-p <portnumber>
a tu comando ssh
¿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.
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 -- X
ver https://stackoverflow.com/a/23616021/32453
Qué tal si:
scp -o "ProxyCommand ssh user@myproxyserver.com nc %h %p" your.filename username@yourdestination.yourdomain.com:/whatever_location
Podrías probar algo como:
ssh user@proxy.machine "ssh user@target.machine '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 user@proxy.machine "ssh user@target.machine 'tar xvf -'"
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.
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
Seguí este artículo y encontré una respuesta que me funciona. (Porque las respuestas anteriores no funcionan para mí).
Cómo hacer scp
un 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 ubuntu@10.60.10.145" \
archive.gz wise@35.xxx.xxx.xxx:/home/wise/archive.gz
Espero que esta respuesta te pueda ayudar.