linux - permission - ¿Cómo hacer scp para volver a local cuando ya he accedido a una máquina remota?
scp linux password (4)
A menudo me enfrento a esta situación: me inscribí en un servidor remoto y ejecuté algunos programas, y quiero copiar sus archivos de salida a mi máquina local. Lo que hago es recordar la ruta del archivo en la máquina remota, salir de la conexión, luego scp user@remote:filepath .
Obviamente esto no es óptimo. Lo que estoy buscando es una forma de permitirme volver a enviar el archivo a la máquina local sin tener que salir de la conexión. Hice una búsqueda, casi todos los resultados me dicen cómo hacer scp desde mi máquina local, que ya sé.
es posible? Mejor aún, ¿es posible sin necesidad de conocer la dirección IP de mi máquina local?
Dado que tiene un sshd
ejecutándose en su máquina local, es posible y no necesita conocer 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 finalizarla.
Supongamos 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 copiar ese archivo a 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
(Enter, luego tilde, luego mayúscula C):
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 igual que las opciones regulares -L/R/D
Necesitaremos -R
, por lo que presionamos Enter ~C
nuevamente y escribimos:
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 otro puerto, utilícelo en lugar de 22).
Ahora simplemente ejecute scp
en un servidor remoto y copie nuestro archivo en el puerto 2222 del servidor remoto, que se asigna al puerto 22 de nuestra máquina local (donde se está ejecutando nuestro sshd
local).
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 simplemente ejecutar scp
desde otra terminal, podría ayudar.
En su computadora local:
scp root @ remotemachine_name_or_IP: / complete_path_to_file / local_path
Encontré que esta solución de una sola línea en la SU es mucho más directa que la respuesta aceptada. Dado que utiliza una variable de entorno 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 a la baja" un archivo (es decir, pasar de una 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 dl somefile.txt
mientras SSH se encuentra en el control remoto y somefile.txt
aparece en mi carpeta de descargas local.
extras:
- Utilizo las teclas rsa (ssh-copy-id) para sortear la solicitud de contraseña
- Encontré este truco para evitar que el bashrc local se obtenga en la llamada scp
Nota: esto requiere acceso SSH a la máquina local desde el control remoto (¿suele ser el caso de alguien?)
Necesitaría un servidor ssh local ejecutándose en su máquina, entonces puede simplemente:
scp [-r] local_content your_local_user@your_local_machine_ip:
De todos modos, no necesita cerrar su conexión remota para hacer una copia remota, simplemente abra otra terminal y ejecute scp allí.