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?

Antworten:


46

(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

export SOCKS_SERVER=127.0.0.1:1080
wget http://server-C/whatever

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

ssh address-of-B 'wget -O - http://server-C/whatever' >> whatever

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 .


6
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).


2

Inspiriert von einer anderen Antwort auf eine andere Frage , empfehle ich die Verwendung von proxychains-ng (der neueren Version von proxychains ).

  1. Laden Sie Proxychains-ng herunter, kompilieren Sie es und installieren Sie es optional .
  2. 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 .
    • Es ist eine Beispielkonfigurationsdatei verfügbar. Die relevantesten Optionen stehen ganz am Ende.
  3. Fügen Sie in Ihrer proxychains.confDatei Folgendes hinzu:

    [ProxyList]
    socks5 127.0.0.1 1234
    
  4. 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).
  5. Run: proxychains4 yourcommandhere yourparametershere. Sehen Sie einige Beispiele:
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/

2

Option 0:

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:

env SOCKS_SERVER=127.0.0.1:1080 socksify wget http://website-C

Option 1:

Leiten Sie die Datei einfach stdoutauf den Server und lesen Sie sie von stdinIhrer Workstation aus.

ssh -C user@hostB "wget -O- http://website-C" >> file-from-website-C

1

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 ...


1

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:

wget http://B:11111/path/to/file

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.
Huygens

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.