Comment télécharger un fichier via un serveur SSH?

31

J'ai un serveur aux USA (Linux box B), et mon PC personnel (Linux box A), et j'ai besoin de télécharger un fichier depuis le site C,

Le problème est qu'il est très lent de télécharger un fichier directement à partir de A, j'ai donc besoin de télécharger le fichier lorsque je me connecte à B et d' sftpobtenir le fichier à partir de A.

Existe-t-il un moyen de télécharger le fichier et d'utiliser B comme proxy directement via une seule commande de ligne?

linjunhalida
la source

Réponses:

46

(Situation étrange, quelque chose comme l' inégalité du triangle ne vaut-il pas pour le routage Internet?)

Quoi qu'il en soit, essayez ce qui suit, sur A , sshen B avec un -Dargument,

ssh -D 1080 address-of-B

qui agit comme un proxy SOCKS5 127.0.0.1:1080, qui peut être utilisé par tout ce qui prend en charge les connexions proxy SOCKS5. Apparemment, wgetpeut le faire , en utilisant la variable d'environnement

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

Notez que parfois curlc'est plus pratique (c'est-à-dire que je ne sais pas si wgetje peux faire des recherches de nom d'hôte via SOCKS5; mais ce n'est pas une de vos préoccupations, je suppose); Firefox est également capable de fonctionner complètement via un tel proxy SOCKS5.

Edit Je viens de remarquer que vous cherchez une solution en ligne . Eh bien, que diriez-vous

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

c'est-à-dire rediriger la wgetsortie récupérée vers stdout, et rediriger la sortie locale (de l' sshexécution à wgetdistance) vers un fichier.

Cela semble fonctionner, la wgetsortie est juste un peu déroutante (" enregistrée dans - "), vous pouvez vous en débarrasser en ajoutant -qà l' wgetappel.

sr_
la source
6
Apparemment, la SOCKS_SERVERvariable d'environnement n'a aucun effet sur Ubuntu 14.04.
kasperd
4
Selon cette autre réponse , wgetn'a pas de support pour SOCKS_SERVERvariable. Cette réponse suggère d'utiliser curl --socks5-hostnameou curl --socks5.
Denilson Sá Maia
@kasperd, alors, est-ce juste ubuntu où cela ne fonctionne pas, ou la variable n'est-elle pas du tout liée à wget? il semble que la variable soit à la socksifyplace.
2015 à 16h23
@cnst Je n'ai vu aucune preuve que n'importe quelle version de wget prend en charge les chaussettes. socksifyn'est pas un paramètre, c'est un programme distinct.
kasperd
Donc, fondamentalement, si vous voulez SOCKS_SERVERavoir un effet wget, vous devez installer ports.su/security/dante , puis exécuter socksify wgetau lieu de simplementwget
cnst
3

Une autre approche pourrait être que vous vous connectiez normalement B, où vous démarrez une screensession. Là, vous faites wgetvos fichiers - le tout dans un seul répertoire.

Et là, le programme peut fonctionner avec plaisir; vous venez de vous détacher de l'écran, mais laissez-le s'exécuter en arrière-plan.

Si les téléchargements sont terminés (peut-être même plus tôt), vous pouvez rechercher les données de Bà l' Autilisation rsync(ma préférence).

glglgl
la source
2

Inspiré par une autre réponse à une autre question , je suggère d'utiliser proxychains-ng (qui est la version la plus récente des proxychains ).

  1. Téléchargez, compilez et installez éventuellement proxychains-ng .
  2. Créez un proxychains.conffichier dans le répertoire courant, ou à ~/.proxychains/proxychains.conf, ou à /etc/proxychains.conf.
    • Sinon, créez un fichier n'importe où ailleurs, ou avec un autre nom, et spécifiez si via l' -fargument de ligne de commande ou via PROXYCHAINS_CONF_FILEla variable d'environnement.
    • Un exemple de fichier de configuration est disponible. Les options les plus pertinentes sont à la toute fin.
  3. Dans votre proxychains.conffichier, ajoutez:

    [ProxyList]
    socks5 127.0.0.1 1234
    
  4. Courez ssh -D 1234 your_host_b. Cela fera écouter ssh sur le port 1234 sur localhost et utilisera votre hôte distant comme proxy SOCKS.

    • Sinon, exécutez à la ssh -ND 1234 your_host_bplace. -Nempêchera ssh d'exécuter une commande sur le serveur distant (c'est-à-dire qu'il n'ouvrira pas de shell).
  5. Run: proxychains4 yourcommandhere yourparametershere. Voir quelques exemples:
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/
Denilson Sá Maia
la source
2

Option 0:

Pour utiliser wgetavec un proxy SOCKS5 à partir de ssh, vous devez installer le security/dantepackage afin d'utiliser l' SOCKS_SERVERoption avec l' socksifyutilitaire.

sudo pkg_add dante

Par la suite, vous ouvrez une connexion SSH en arrière-plan:

ssh -N -C -D1080 user@hostB &

Et utilisez wget via un proxy SOCKS5 via socksify:

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

Option 1:

Il suffit de diriger le fichier stdoutsur le serveur et de le lire stdinsur votre poste de travail.

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

Vous pouvez faire un tunnel ssh de la boîte A à la boîte B et ajouter à la table de routage de la boîte A, que le site Web C est accessible via le tunnel vers la boîte B. Vous devez autoriser le transfert de paquets sur la boîte B.

Ici vous pouvez voir un très bon tutoriel étape par étape ...

Jan Marek
la source
1

Vous auriez besoin de créer un tunnel sur la machine B qui redirigerait l'appel vers le site Web C. Mais je suis perplexe quant à la raison pour laquelle cela serait plus rapide, à moins que votre FAI ne présente certaines restrictions.

Je ne connais pas un oneliner, mais ce n'est pas beaucoup plus compliqué.

Sur la machine A, vous le faites (j'ai pris 11111 au hasard, vous pouvez prendre ce que vous voulez tant qu'il est> 1024, ou vous devrez être root)

ssh -f -C -N -L 11111:C:80 username@B

Le nom d'utilisateur sur B est celui que vous utilisez pour vous connecter à B. Cela devrait créer un tunnel sur le port 11111 sur la machine B qui redirige vers le port 80 (site Web en HTTP utiliser 443 pour HTTPS) sur la machine C (j'espère que je n'ai pas gâché l'ordre ;) )

Ensuite, vous pouvez télécharger le fichier directement depuis la machine A via la machine B. Je suppose que le fichier est à http://C/path/to/filedonc vous utiliseriez alors:

wget http://B:11111/path/to/file
Huygens
la source
Cela ne fonctionnerait-il que si le fichier est accessible sans hébergement virtuel basé sur le nom HTTP 1.1? Étant donné que la demande GET émise par wget indiquerait le nom d'hôte comme B, pas C.
un CVn
@ MichaelKjörling Je n'ai pas assez de connaissances pour vous répondre.
Huygens