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?

linjunhalida
quelle

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 .

sr_
quelle
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).

glglgl
quelle
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/
Denilson Sá Maia
quelle
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
cnst
quelle
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 ...

Jan Marek
quelle
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
Huygens
quelle
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