it-swarm.com.de

Wie lade ich eine Datei über einen SSH-Server herunter?

Ich habe einen Server in den USA (Linux Box B) und meinen Heim-PC (Linux Box A) und muss eine Datei von Website C herunterladen.

Das Problem ist, dass das Herunterladen einer Datei direkt von A sehr langsam ist. Daher muss ich die Datei herunterladen, wenn ich mich bei B anmelde, und sftp die Datei von A abrufen.

Gibt es eine Möglichkeit, die Datei herunterzuladen und B als Proxy direkt über nur einen Zeilenbefehl zu verwenden?

31
linjunhalida

(Seltsame Situation, gilt nicht so etwas wie Dreiecksungleichung für Internet-Routing?)

Versuchen Sie auf jeden Fall Folgendes auf [~ # ~] a [~ # ~] , ssh in [~ # ~] b [~ # ~] mit einem -D Argument,

ssh -D 1080 address-of-B

dies fungiert als SOCKS5-Proxy für 127.0.0.1:1080, der von allen Benutzern verwendet werden kann, die SOCKS5-Proxy-Verbindungen unterstützen. Anscheinend kann wget dies tun , indem die Umgebungsvariable verwendet wird

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

Beachten Sie, dass curl manchmal praktischer ist (d. H. Ich bin nicht sicher, ob wget Hostnamensuchen über SOCKS5 durchführen kann; dies ist jedoch vermutlich nicht eines Ihrer Anliegen). Auch Firefox kann einen solchen SOCKS5-Proxy vollständig verarbeiten.

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

d.h. Umleiten der wget- abgerufenen Ausgabe an stdout und Umleiten der lokalen Ausgabe (von ssh, die wget remote ausführt) in eine Datei.

Dies scheint zu funktionieren, die Ausgabe von wget ist nur ein wenig verwirrend (" gespeichert in -"). Sie können sie entfernen, indem Sie -q Hinzufügen der Aufruf wget.

47
sr_

Ein anderer Ansatz könnte sein, dass Sie sich normalerweise bei B anmelden, wo Sie eine screen Sitzung starten. Dort erledigen Sie das wget Ihrer Dateien - alles in einem Verzeichnis.

Und dort kann das Programm glücklich laufen; Sie lösen sich einfach vom Bildschirm, lassen ihn aber im Hintergrund laufen.

Wenn die Downloads abgeschlossen sind (möglicherweise sogar früher), können Sie die Daten von B nach A mit rsync (meine Präferenz) abrufen.

3
glglgl

Option 0:

Um wget mit einem SOCKS5-Proxy von ssh zu verwenden, müssen Sie security/dante Paket, um die Option SOCKS_SERVER mit dem Dienstprogramm socksify zu verwenden.

Sudo pkg_add dante

Anschließend öffnen Sie im Hintergrund eine SSH-Verbindung:

ssh -N -C -D1080 [email protected] &

Und verwenden Sie 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 an stdout auf dem Server weiter und lesen Sie sie von stdin auf Ihrer Workstation.

ssh -C [email protected] "wget -O- http://website-C" >> file-from-website-C
2
cnst

Inspiriert von eine andere Antwort auf eine andere Frage schlage ich vor, proxychains-ng (die neuere Version von proxychains ) zu verwenden.

  1. Herunterladen, kompilieren und optional installieren proxychains-ng .
  2. Ein ... kreieren proxychains.conf Datei im aktuellen Verzeichnis oder unter ~/.proxychains/proxychains.conf, oder bei /etc/proxychains.conf.
    • Alternativ können Sie eine Datei an einer anderen Stelle oder mit einem anderen Namen erstellen und angeben, ob durch -f Befehlszeilenargument oder über PROXYCHAINS_CONF_FILE Umgebungsvariable.
    • Es ist eine Beispielkonfigurationsdatei verfügbar. Die wichtigsten Optionen stehen ganz am Ende.
  3. In deinem proxychains.conf Datei, hinzufügen:

    [ProxyList]
    socks5 127.0.0.1 1234
    
  4. Lauf ssh -D 1234 your_Host_b. Dadurch überwacht ssh Port 1234 auf localhost und verwendet Ihren Remote-Host als SOCKS-Proxy.

    • Alternativ können Sie ssh -ND 1234 your_Host_b stattdessen. -N verhindert, dass ssh einen Befehl auf dem Remote-Server ausführt (d. h. es öffnet keine Shell).
  5. Lauf: proxychains4 yourcommandhere yourparametershere. Siehe einige Beispiele:
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/
2

Sie können einen SSH-Tunnel von Box A nach Box B erstellen und der Routing-Tabelle in Box A hinzufügen, dass die Website C über den Tunnel zu Box B erreichbar ist. Sie müssen die Paketweiterleitung auf Box B zulassen.

hier Sie können eine sehr gute Schritt-für-Schritt-Anleitung sehen ...

1
Jan Marek

Sie müssten auf Tunnel B einen Tunnel erstellen, der den Anruf auf Website C umleitet. Ich bin jedoch verwirrt, warum dies schneller wäre, es sei denn, Ihr ISP hat einige Einschränkungen.

Ich kenne keinen Oneliner, aber das ist nicht viel komplizierter.

Auf Maschine A tun Sie das (ich habe 11111 zufällig genommen, Sie können nehmen, was Sie wollen, solange es> 1024 ist, oder Sie müssten root sein)

ssh -f -C -N -L 11111:C:80 [email protected]

Der Benutzername auf B ist derjenige, mit dem Sie eine Verbindung zu B herstellen. Dadurch sollte auf Port 11111 auf Computer B ein Tunnel erstellt werden, der auf Port 80 (Website in HTTP verwendet 443 für HTTPS) auf Computer C umleitet (ich hoffe, ich habe nicht durcheinander gebracht) die Bestellung ;) )

Dann können Sie die Datei direkt von Maschine A über Maschine B herunterladen. Ich gehe davon aus, dass sich die Datei bei http://C/path/to/file Befindet, sodass Sie dann Folgendes verwenden würden:

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

Sie können dies über die Portweiterleitung (SSH-Tunneling) tun. Hier ist eine Ressource: http://www.jfranken.de/homepages/johannes/vortraege/ssh2_inhalt.en.html#ToC9

Im Wesentlichen sollten Sie die Portweiterleitung für B einrichten. Wenn A Probleme mit B verursacht, leitet B die Pakete an C weiter und sendet die Ergebnisse an A zurück.

1
RonE