Vorausgesetzt, Sie haben einen sshd
auf Ihrem lokalen Rechner ausgeführt wird, ist dies möglich und Sie müssen Ihre ausgehende IP-Adresse nicht kennen. Wenn die SSH-Portweiterleitung aktiviert ist, können Sie einen sicheren Tunnel öffnen, selbst wenn Sie bereits eine SSH-Verbindung geöffnet haben, und ohne diese zu beenden.
Angenommen, Sie haben eine SSH-Verbindung zu einem Server:
local $ ssh [email protected]
Password:
remote $ echo abc > abc.txt # now we have a file here
OK, jetzt müssen wir diese Datei zurück auf unseren lokalen Server kopieren, und aus irgendeinem Grund wollen wir keine neue Verbindung öffnen. OK, rufen wir die ssh-Befehlszeile ab, indem wir Enter ~C
drücken (Eingabe, dann Tilde, dann Großbuchstabe 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
Das ist genau wie das normale -L/R/D
Optionen. Wir brauchen -R
, also haben wir Enter ~C
getroffen erneut und geben Sie Folgendes ein:
ssh> -R 127.0.0.1:2222:127.0.0.1:22
Forwarding port.
Hier leiten wir Port 2222 des Remote-Servers an Port 22 der lokalen Maschine weiter (und hier muss der lokale SSH-Server auf Port 22 gestartet werden; wenn er auf einem anderen Port lauscht, verwenden Sie ihn anstelle von 22).
Führen Sie jetzt einfach scp
aus auf einem Remote-Server und kopieren Sie unsere Datei auf den Port 2222 des Remote-Servers, der dem Port 22 unserer lokalen Maschine zugeordnet ist (wo unser lokaler sshd
läuft).
remote $ scp -P2222 abc.txt [email protected]:
[email protected]'s password:
abc.txt 100% 4 0.0KB/s 00:00
Wir sind fertig!
remote $ exit
logout
Connection to example.com closed.
local $ cat abc.txt
abc
Schwierig, aber wenn Sie wirklich nicht können Führen Sie einfach scp
aus von einem anderen Terminal, könnte helfen.
Ich fand diese Einzeiler-Lösung auf SU viel einfacher als die akzeptierte Antwort. Da es eine Umgebungsvariable für die lokale IP-Adresse verwendet, denke ich, dass es auch die Anforderung des OP erfüllt, es nicht im Voraus zu wissen.
Darauf basierend ist hier eine Bash-Funktion zum "Herunterladen" einer Datei (d. h. Pushen von einer SSH-Sitzung an einen festgelegten Speicherort auf dem lokalen Computer)
function dl(){
scp "$1" ${CLIENT_IP%% *}:/home/<USER>/Downloads
}
Jetzt kann ich einfach dl somefile.txt
anrufen während SSH in die Fernbedienung und somefile.txt
erscheint in meinem lokalen Download-Ordner.
Extras:
- Ich verwende RSA-Schlüssel (ssh-copy-id), um die Passwortabfrage zu umgehen
- Ich habe diesen Trick gefunden, um zu verhindern, dass der lokale bashrc beim scp-Aufruf bezogen wird
Hinweis:Dies erfordert SSH-Zugriff auf den lokalen Computer von der Ferne (ist das oft bei jemandem der Fall?)