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?
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
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
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.
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).
Téléchargez, compilez et installez éventuellement proxychains-ng .
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.
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).
Run: proxychains4 yourcommandhere yourparametershere. Voir quelques exemples:
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:
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 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:
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.
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.
SOCKS_SERVER
variable d'environnement n'a aucun effet sur Ubuntu 14.04.wget
n'a pas de support pourSOCKS_SERVER
variable. Cette réponse suggère d'utilisercurl --socks5-hostname
oucurl --socks5
.socksify
place.socksify
n'est pas un paramètre, c'est un programme distinct.SOCKS_SERVER
avoir un effetwget
, vous devez installer ports.su/security/dante , puis exécutersocksify wget
au lieu de simplementwget
Une autre approche pourrait être que vous vous connectiez normalement
B
, où vous démarrez unescreen
session. Là, vous faiteswget
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
à l'A
utilisationrsync
(ma préférence).la source
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 ).
proxychains.conf
fichier dans le répertoire courant, ou à~/.proxychains/proxychains.conf
, ou à/etc/proxychains.conf
.-f
argument de ligne de commande ou viaPROXYCHAINS_CONF_FILE
la variable d'environnement.Dans votre
proxychains.conf
fichier, ajoutez: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.ssh -ND 1234 your_host_b
place.-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/
la source
Option 0:
Pour utiliser
wget
avec un proxy SOCKS5 à partir dessh
, vous devez installer lesecurity/dante
package afin d'utiliser l'SOCKS_SERVER
option avec l'socksify
utilitaire.Par la suite, vous ouvrez une connexion SSH en arrière-plan:
Et utilisez wget via un proxy SOCKS5 via socksify:
Option 1:
Il suffit de diriger le fichier
stdout
sur le serveur et de le lirestdin
sur votre poste de travail.la source
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 ...
la source
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)
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
donc vous utiliseriez alors:la source
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.
la source