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?
(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
.
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).
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
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
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 ).
proxychains.conf
fichier dans le répertoire courant ou à ~/.proxychains/proxychains.conf
, ou à /etc/proxychains.conf
. -f
argument de ligne de commande, ou via PROXYCHAINS_CONF_FILE
variable d'environnement.Dans ton proxychains.conf
fichier, ajoutez:
[ProxyList]
socks5 127.0.0.1 1234
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.
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).proxychains4 yourcommandhere yourparametershere
. Voir quelques exemples: proxychains4 wget -O - http://ifconfig.co/
proxychains4 -q links http://ifconfig.co/
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 ...
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
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.