Dato che hai un sshd
in esecuzione sul tuo computer locale, è possibile e non è necessario conoscere il tuo indirizzo IP in uscita. Se il port forwarding SSH è abilitato, puoi aprire un tunnel sicuro anche quando hai già una connessione ssh aperta e senza terminarla.
Supponiamo che tu abbia una connessione ssh a qualche server:
local $ ssh example@unixlinux.online
Password:
remote $ echo abc > abc.txt # now we have a file here
OK ora dobbiamo copiare quel file sul nostro server locale e per qualche motivo non vogliamo aprire una nuova connessione. OK, prendiamo la riga di comando ssh premendo Enter ~C
(Digita, poi tilde, poi C maiuscola):
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
È proprio come il normale -L/R/D
opzioni. Avremo bisogno di -R
, quindi premiamo Enter ~C
di nuovo e digita:
ssh> -R 127.0.0.1:2222:127.0.0.1:22
Forwarding port.
Qui inoltriamo la porta 2222 del server remoto alla porta 22 della macchina locale (ed è qui che è necessario che il server SSH locale sia avviato sulla porta 22; se è in ascolto su un'altra porta, usala invece della 22).
Ora basta eseguire scp
su un server remoto e copia il nostro file sulla porta 2222 del server remoto che è mappata sulla porta 22 della nostra macchina locale (dove il nostro sshd
locale è in esecuzione).
remote $ scp -P2222 abc.txt example@unixlinux.online:
example@unixlinux.online's password:
abc.txt 100% 4 0.0KB/s 00:00
Abbiamo finito!
remote $ exit
logout
Connection to example.com closed.
local $ cat abc.txt
abc
Complicato, ma se davvero non puoi basta eseguire scp
da un altro terminale, potrebbe essere d'aiuto.
Ho trovato questa soluzione di una riga su SU molto più semplice della risposta accettata. Poiché utilizza una variabile ambientale per l'indirizzo IP locale, penso che soddisfi anche la richiesta dell'OP di non conoscerlo in anticipo.
sulla base di ciò, ecco una funzione bash per "scaricare" un file (ovvero inviare dalla sessione SSH a una posizione impostata sulla macchina locale)
function dl(){
scp "$1" ${CLIENT_IP%% *}:/home/<USER>/Downloads
}
Ora posso solo chiamare dl somefile.txt
mentre SSH era collegato al telecomando e somefile.txt
appare nella mia cartella Download locale.
extra:
- Uso le chiavi rsa (ssh-copy-id) per aggirare la richiesta della password
- Ho trovato questo trucco per evitare che il bashrc locale venga prelevato dalla chiamata scp
Nota:questo richiede l'accesso SSH alla macchina locale da remoto (è così spesso per chiunque?)