Dado que tienes un sshd
ejecutándose en su máquina local, es posible y no necesita saber su dirección IP saliente. Si el reenvío de puertos SSH está habilitado, puede abrir un túnel seguro incluso cuando ya tiene una conexión ssh abierta y sin terminarla.
Suponga que tiene una conexión ssh a algún servidor:
local $ ssh [email protected]
Password:
remote $ echo abc > abc.txt # now we have a file here
Bien, ahora necesitamos volver a copiar ese archivo en nuestro servidor local y, por alguna razón, no queremos abrir una nueva conexión. OK, obtengamos la línea de comando ssh presionando Enter ~C
(Ingresar, luego tilde, luego C mayúscula):
ssh> help
Commands:
-L[bind_address:]port:host:hostport Request local forward
-R[bind_address:]port:host:hostport Request remote forward
-D[bind_address:]port Request dynamic forward
-KR[bind_address:]port Cancel remote forward
Eso es como el -L/R/D
regular opciones Necesitaremos -R
, así que presionamos Enter ~C
de nuevo y escriba:
ssh> -R 127.0.0.1:2222:127.0.0.1:22
Forwarding port.
Aquí reenviamos el puerto 2222 del servidor remoto al puerto 22 de la máquina local (y aquí es donde necesita que el servidor SSH local se inicie en el puerto 22; si está escuchando en algún otro puerto, utilícelo en lugar del 22).
Ahora solo ejecuta scp
en un servidor remoto y copie nuestro archivo en el puerto 2222 del servidor remoto que está asignado al puerto 22 de nuestra máquina local (donde nuestro sshd
local se está ejecutando).
remote $ scp -P2222 abc.txt [email protected]:
[email protected]'s password:
abc.txt 100% 4 0.0KB/s 00:00
¡Hemos terminado!
remote $ exit
logout
Connection to example.com closed.
local $ cat abc.txt
abc
Difícil, pero si realmente no puedes solo ejecuta scp
desde otra terminal, podría ayudar.
Descubrí que esta solución de una sola línea en SU es mucho más sencilla que la respuesta aceptada. Dado que utiliza una variable ambiental para la dirección IP local, creo que también satisface la solicitud del OP de no saberlo de antemano.
basado en eso, aquí hay una función bash para "Descargar" un archivo (es decir, empujar desde la sesión SSH a una ubicación establecida en la máquina local)
function dl(){
scp "$1" ${CLIENT_IP%% *}:/home/<USER>/Downloads
}
Ahora solo puedo llamar a dl somefile.txt
mientras usa SSH en el control remoto y somefile.txt
aparece en mi carpeta de Descargas local.
adicionales:
- Utilizo claves rsa (ssh-copy-id) para sortear la solicitud de contraseña
- Encontré este truco para evitar que el bashrc local se origine en la llamada scp
Nota:esto requiere acceso SSH a la máquina local desde un lugar remoto (¿suele ser así para alguien?)