J'utilise CentOS6.x avec yum-3.2.29-81, curl / libcurl 7.19.7-53 et j'ai ce même problème. J'ai des serveurs yum derrière un pare-feu et je veux utiliser yum sur une configuration de proxy SOCKS5 en utilisant ssh. Idéalement, je veux le faire sans avoir besoin de tsocks, de proxychains ou de tout autre utilitaire de "socksification".
J'ai configuré la connexion SOCKS5 en utilisant:
ssh -D 40000 dmz-server
J'ai fouillé dans les sources de python yum et j'ai vu qu'elles utilisaient pycurl qui enveloppe libcurl (veuillez également noter que toutes les variables d'environnement proxy - http_proxy, HTTP_PROXY, all_proxy, ALL_PROXY, etc. - étaient initialement indéfinies). De plus, j'ai vérifié que ~ / .curlrc était vide, donc cela n'a pas entaché mes résultats de test.
Je voulais voir si je pouvais obtenir curl pour parler via le proxy socks5:
curl --socks5 127.0.0.1:40000 http://some-server/some-url
a renvoyé avec succès la page Web distante, donc c'était un bon signe - montrant que libcurl peut utiliser les proxys SOCKS5. Cependant, définir une variable d'environnement
http_proxy=socks5://127.0.0.1:40000
n'était pas suffisant:
http_proxy=socks5://127.0.0.1:40000 curl http://some-server/some-url
échoué.
À ce stade, je suis passé à l'utilisation d'un programme de test Python test.py :
import pycurl
import sys
sys.stderr.write("Testing %s\n" % pycurl.version)
c = pycurl.Curl()
c.setopt(c.URL, 'http://some-server/some-url')
c.setopt(c.WRITEFUNCTION, sys.stdout.write)
c.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
c.perform()
c.close()
Maintenant, en cours d'exécution
./test.py
ne parviendra pas à récupérer, mais en cours d'exécution
http_proxy=socks5://127.0.0.1:40000 ./test.py
va chercher avec succès http: // some-serveur / some-url . Il me semble donc que cette combinaison (certes ancienne) yum / libcurl livrée avec CentOS6 ne définit pas correctement le type de proxy dans libcurl. Je pense que ce qui se passe, c'est que le PROXYTYPE utilise par défaut un proxy HTTP standard au lieu d'identifier le schéma socks5: // dans l'URL spécifiée dans la variable d'environnement http_proxy .
Dans tous les cas, le correctif suivant vers /usr/lib/python2.6/site-packages/urlgrabber/grabber.py a fonctionné pour me permettre d'accéder aux référentiels http: // yum via un proxy SOCKS5. Dans PyCurlFileObject # _set_opts (self, opts = {}), ajoutez:
if self.scheme == 'http':
proxy = os.getenv('http_proxy') or os.getenv('HTTP_PROXY') or os.getenv('all_proxy') or os.getenv('ALL_PROXY')
if proxy and proxy.find("socks5://") != -1:
self.curl_obj.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
autour de la ligne 1205, juste avant
# ssl options
if self.scheme == 'https':
Avec ce changement,
http_proxy=socks5://127.0.0.1:40000 yum install <package_name>
se connecte avec succès à tous mes référentiels http: // yum de l'autre côté du pare-feu via le proxy SOCKS5 ssh.
Bien sûr, on pourrait exporter la variable d'environnement http_proxy dans son shell pour éviter de la spécifier avant chaque appel de yum .