web-dev-qa-db-fra.com

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

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 depuis A, j'ai donc besoin de télécharger le fichier lorsque je me connecte B, et sftp obtenir le fichier depuis 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?

31
linjunhalida

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

Quoi qu'il en soit, essayez ce qui suit, sur [~ # ~] a [~ # ~] , ssh dans [~ # ~] b [~ # ~] avec un -D argument,

ssh -D 1080 address-of-B

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

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

Notez que parfois curl est plus pratique (c'est-à-dire que je ne sais pas si wget peut 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.

Modifier Je viens de remarquer que vous recherchez un une ligne Solution. Eh bien, que diriez-vous

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

c'est-à-dire rediriger la sortie récupérée par wget vers stdout et rediriger la sortie locale (de ssh en exécutant wget à distance) vers un fichier.

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

47
sr_

Une autre approche pourrait être que vous vous connectiez normalement à B, où vous démarrez une session screen. Là, vous faites le wget de vos 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 vers A en utilisant rsync (ma préférence).

3
glglgl

Option 0:

Pour utiliser wget avec un proxy SOCKS5 de ssh , vous devez installer security/dante package afin d'utiliser le SOCKS_SERVER option avec l'utilitaire socksify.

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 vers stdout sur le serveur et de le lire depuis stdin sur votre poste de travail.

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

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

  1. Téléchargez, compilez et installez éventuellement proxychains-ng .
  2. Créer un proxychains.conf fichier dans le répertoire courant ou à ~/.proxychains/proxychains.conf, ou à /etc/proxychains.conf.
    • Vous pouvez également créer un fichier ailleurs ou avec un autre nom et spécifier si par -f argument de ligne de commande, ou via PROXYCHAINS_CONF_FILE variable d'environnement.
    • Il y a un exemple de fichier de configuration disponible. Les options les plus pertinentes sont à la toute fin.
  3. Dans ton proxychains.conf fichier, ajoutez:

    [ProxyList]
    socks5 127.0.0.1 1234
    
  4. Courir 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.

    • Vous pouvez également exécuter ssh -ND 1234 your_Host_b au lieu. -N empêchera ssh d'exécuter une commande sur le serveur distant (c'est-à-dire qu'il n'ouvrira pas de shell).
  5. Courir: proxychains4 yourcommandhere yourparametershere. Voir quelques exemples:
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/
2
Denilson Sá Maia

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

1
Jan Marek

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 de ligne unique, 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/file vous utiliseriez alors:

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

Vous pouvez le faire via la redirection de port (tunneling ssh). Voici une ressource: http://www.jfranken.de/homepages/johannes/vortraege/ssh2_inhalt.fr.html#ToC9

Essentiellement, vous devez configurer la redirection de port sur B. Lorsque A émet wget vers B, B transmet les paquets à C et renvoie les résultats à A.

1
RonE