Wie lade ich eine Datei über einen SSH-Server herunter?
31
Ich habe einen Server in den USA (Linux-Box B) und meinen Heim-PC (Linux-Box A) und muss eine Datei von der Website C herunterladen.
Das Problem ist, dass es sehr langsam ist, eine Datei direkt von A herunterzuladen. Daher muss ich die Datei herunterladen, wenn ich mich bei B anmelde, und sftpdie Datei von A abrufen.
Gibt es eine Möglichkeit, die Datei herunterzuladen und B als Proxy direkt über nur einen Zeilenbefehl zu verwenden?
(Seltsame Situation, gilt nicht so etwas wie die Dreiecksungleichheit für das Internet-Routing?)
Wie auch immer, versuchen Sie die folgende, auf A , sshin B mit einem -DArgument,
ssh -D 1080 address-of-B
Dies fungiert als SOCKS5-Proxy 127.0.0.1:1080, der von allen SOCKS5-Proxy-Verbindungen verwendet werden kann. Anscheinend wgetkann dies mit der Umgebungsvariablen geschehen
Beachten Sie, dass dies manchmal curlpraktischer ist (dh ich bin mir nicht sicher, ob wgetich über SOCKS5 nach Hostnamen suchen kann; dies ist jedoch vermutlich keine Ihrer Bedenken). auch Firefox kann einen solchen SOCKS5-Proxy vollständig durcharbeiten.
Bearbeiten Ich habe gerade bemerkt, dass Sie nach einer einzeiligen Lösung suchen . Nun, wie wäre es
dh Redirection wget-fetched ausgegeben stdout, und den lokalen Ausgangs Umleiten (von sshLaufe wgetremote) in eine Datei.
Dies scheint zu funktionieren, die wgetAusgabe ist nur ein wenig verwirrend (" gespeichert in - "). Sie können sie entfernen, indem Sie sie -qzum wgetAufruf hinzufügen .
Anscheinend hat die SOCKS_SERVERUmgebungsvariable keinen Einfluss auf Ubuntu 14.04.
Kasperd
4
Gemäß dieser anderen Antwort , wgethat keine Unterstützung für SOCKS_SERVERVariable. Diese Antwort schlägt die Verwendung von curl --socks5-hostnameoder vor curl --socks5.
Denilson Sá Maia,
@kasperd, also ist es nur Ubuntu, wo es nicht funktioniert, oder ist die Variable überhaupt nicht mit wget verbunden? Es scheint, dass die Variable socksifystattdessen für sein könnte .
Uhr
@cnst Ich habe keine Beweise dafür gesehen, dass jede Version von wget Socken unterstützt. socksifyist keine Einstellung, es ist ein separates Programm.
Kasperd
so, im Grunde, wenn Sie SOCKS_SERVERauf einen Effekt haben wget, dann müssen Sie installieren ports.su/security/dante , und dann laufen , socksify wgetanstatt nurwget
CNST
3
Ein anderer Ansatz könnte sein, dass Sie sich normalerweise anmelden B, um eine screenSitzung zu starten . Dort erledigen Sie wgetIhre Dateien - alles in einem Verzeichnis.
Und dort kann das Programm glücklich laufen; Sie trennen sich nur vom Bildschirm, lassen ihn jedoch im Hintergrund laufen.
Wenn die Downloads beendet sind (vielleicht sogar früher), können Sie die Daten von Bzu Averwenden rsync(meine Präferenz).
Laden Sie Proxychains-ng herunter, kompilieren Sie es und installieren Sie es optional .
Erstellen Sie eine proxychains.confDatei im aktuellen Verzeichnis oder unter ~/.proxychains/proxychains.confoder unter /etc/proxychains.conf.
Alternativ können Sie eine Datei an einer anderen Stelle oder mit einem anderen Namen erstellen und über ein -fBefehlszeilenargument oder eine PROXYCHAINS_CONF_FILEUmgebungsvariable angeben .
Fügen Sie in Ihrer proxychains.confDatei Folgendes hinzu:
[ProxyList]
socks5 127.0.0.1 1234
Rennen ssh -D 1234 your_host_b. Dadurch lauscht ssh auf Port 1234 auf localhost und verwendet Ihren Remote-Host als SOCKS-Proxy.
Alternativ können Sie ssh -ND 1234 your_host_bstattdessen ausführen . -Nverhindert, dass ssh Befehle auf dem Remote-Server ausführt (dh, es wird keine Shell geöffnet).
Run: proxychains4 yourcommandhere yourparametershere. Sehen Sie einige Beispiele:
Um wgetmit einem SOCKS5-Proxy von zu verwenden ssh, müssen Sie das security/dantePaket installieren , um die SOCKS_SERVEROption mit dem socksifyDienstprogramm zu verwenden.
sudo pkg_add dante
Anschließend öffnen Sie im Hintergrund eine SSH-Verbindung:
ssh -N -C -D1080 user@hostB &
Und benutze wget über einen SOCKS5-Proxy über socksify:
Sie können einen SSH-Tunnel von Box A zu Box B erstellen und der Routing-Tabelle in Box A hinzufügen, dass die Website C über einen Tunnel zu Box B erreichbar ist. Sie müssen die Paketweiterleitung auf Box B zulassen.
Hier sehen Sie eine sehr gute Schritt-für-Schritt-Anleitung ...
Sie müssten auf Computer B einen Tunnel erstellen, der den Anruf auf Website C umleitet. Ich bin jedoch verwirrt, warum dies schneller ist, es sei denn, Ihr Internetdienstanbieter weist Einschränkungen auf.
Ich kenne keinen Oneliner, aber das ist nicht viel komplizierter.
Auf Maschine A tust du das (ich habe 11111 zufällig genommen, du kannst nehmen, was immer du willst, solange es> 1024 ist, oder du müsstest root sein)
ssh -f -C -N -L 11111:C:80 username@B
Der Benutzername auf B ist derjenige, mit dem Sie eine Verbindung zu B herstellen. Dies sollte einen Tunnel auf Port 11111 auf Computer B erstellen, der auf Computer C (ich hoffe, ich habe keine Probleme) zu Port 80 (Website in HTTP verwenden 443 für HTTPS) umleitet die Bestellung ;) )
Dann können Sie die Datei direkt von Maschine A über Maschine B herunterladen. Ich gehe davon aus, dass sich die Datei auf befindet, http://C/path/to/filesodass Sie dann Folgendes verwenden würden:
Funktioniert dies nicht nur, wenn auf die Datei ohne auf HTTP 1.1-Namen basierendes virtuelles Hosting zugegriffen werden kann? Da die von wget ausgegeben GET - Anfrage würde die Hostnamen als B - Zustand, nicht C
ein CVn
@ MichaelKjörling Ich habe nicht genug Wissen, um dir zu antworten.
Im Wesentlichen sollten Sie die Portweiterleitung auf B einrichten. Wenn A Probleme mit B hat, leitet B die Pakete an C weiter und sendet die Ergebnisse zurück an A.
SOCKS_SERVER
Umgebungsvariable keinen Einfluss auf Ubuntu 14.04.wget
hat keine Unterstützung fürSOCKS_SERVER
Variable. Diese Antwort schlägt die Verwendung voncurl --socks5-hostname
oder vorcurl --socks5
.socksify
stattdessen für sein könnte .socksify
ist keine Einstellung, es ist ein separates Programm.SOCKS_SERVER
auf einen Effekt habenwget
, dann müssen Sie installieren ports.su/security/dante , und dann laufen ,socksify wget
anstatt nurwget
Ein anderer Ansatz könnte sein, dass Sie sich normalerweise anmelden
B
, um einescreen
Sitzung zu starten . Dort erledigen Siewget
Ihre Dateien - alles in einem Verzeichnis.Und dort kann das Programm glücklich laufen; Sie trennen sich nur vom Bildschirm, lassen ihn jedoch im Hintergrund laufen.
Wenn die Downloads beendet sind (vielleicht sogar früher), können Sie die Daten von
B
zuA
verwendenrsync
(meine Präferenz).quelle
Inspiriert von einer anderen Antwort auf eine andere Frage , empfehle ich die Verwendung von proxychains-ng (der neueren Version von proxychains ).
proxychains.conf
Datei im aktuellen Verzeichnis oder unter~/.proxychains/proxychains.conf
oder unter/etc/proxychains.conf
.-f
Befehlszeilenargument oder einePROXYCHAINS_CONF_FILE
Umgebungsvariable angeben .Fügen Sie in Ihrer
proxychains.conf
Datei Folgendes hinzu:Rennen
ssh -D 1234 your_host_b
. Dadurch lauscht ssh auf Port 1234 auf localhost und verwendet Ihren Remote-Host als SOCKS-Proxy.ssh -ND 1234 your_host_b
stattdessen ausführen .-N
verhindert, dass ssh Befehle auf dem Remote-Server ausführt (dh, es wird keine Shell geöffnet).proxychains4 yourcommandhere yourparametershere
. Sehen Sie einige Beispiele:proxychains4 wget -O - http://ifconfig.co/
proxychains4 -q links http://ifconfig.co/
quelle
Option 0:
Um
wget
mit einem SOCKS5-Proxy von zu verwendenssh
, müssen Sie dassecurity/dante
Paket installieren , um dieSOCKS_SERVER
Option mit demsocksify
Dienstprogramm zu verwenden.Anschließend öffnen Sie im Hintergrund eine SSH-Verbindung:
Und benutze wget über einen SOCKS5-Proxy über socksify:
Option 1:
Leiten Sie die Datei einfach
stdout
auf den Server und lesen Sie sie vonstdin
Ihrer Workstation aus.quelle
Sie können einen SSH-Tunnel von Box A zu Box B erstellen und der Routing-Tabelle in Box A hinzufügen, dass die Website C über einen Tunnel zu Box B erreichbar ist. Sie müssen die Paketweiterleitung auf Box B zulassen.
Hier sehen Sie eine sehr gute Schritt-für-Schritt-Anleitung ...
quelle
Sie müssten auf Computer B einen Tunnel erstellen, der den Anruf auf Website C umleitet. Ich bin jedoch verwirrt, warum dies schneller ist, es sei denn, Ihr Internetdienstanbieter weist Einschränkungen auf.
Ich kenne keinen Oneliner, aber das ist nicht viel komplizierter.
Auf Maschine A tust du das (ich habe 11111 zufällig genommen, du kannst nehmen, was immer du willst, solange es> 1024 ist, oder du müsstest root sein)
Der Benutzername auf B ist derjenige, mit dem Sie eine Verbindung zu B herstellen. Dies sollte einen Tunnel auf Port 11111 auf Computer B erstellen, der auf Computer C (ich hoffe, ich habe keine Probleme) zu Port 80 (Website in HTTP verwenden 443 für HTTPS) umleitet die Bestellung ;) )
Dann können Sie die Datei direkt von Maschine A über Maschine B herunterladen. Ich gehe davon aus, dass sich die Datei auf befindet,
http://C/path/to/file
sodass Sie dann Folgendes verwenden würden:quelle
Sie können dies über die Portweiterleitung (SSH-Tunneling) tun. Hier ist eine Ressource: http://www.jfranken.de/homepages/johannes/vortraege/ssh2_inhalt.de.html#ToC9
Im Wesentlichen sollten Sie die Portweiterleitung auf B einrichten. Wenn A Probleme mit B hat, leitet B die Pakete an C weiter und sendet die Ergebnisse zurück an A.
quelle