Sto usando CentOS6.x con yum-3.2.29-81, curl / libcurl 7.19.7-53 e ho lo stesso problema. Ho server yum dietro un firewall e voglio usare yum su una configurazione proxy SOCKS5 usando ssh. Idealmente, voglio farlo senza richiedere tsock, proxychain o altre utilità di "socksification".
Ho impostato la connessione SOCKS5 usando:
ssh -D 40000 dmz-server
Ho cercato tra le fonti di Yum Python e ho visto che usano pycurl che avvolge libcurl (si noti inoltre che tutte le variabili di ambiente proxy - http_proxy, HTTP_PROXY, all_proxy, ALL_PROXY, ecc. - inizialmente non erano definite). Inoltre, ho verificato che ~ / .curlrc era vuoto, quindi non ha contaminato i risultati del test.
Volevo vedere se potevo farmi arricciare per parlare attraverso il proxy socks5:
curl --socks5 127.0.0.1:40000 http://some-server/some-url
ha restituito correttamente la pagina Web remota, quindi era un buon segno - mostrando libcurl può usare i proxy SOCKS5. Tuttavia, definendo una variabile di ambiente
http_proxy=socks5://127.0.0.1:40000
non era abbastanza:
http_proxy=socks5://127.0.0.1:40000 curl http://some-server/some-url
fallito.
A questo punto, sono passato all'utilizzo di un programma di 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()
Adesso, correndo
./test.py
non riuscirà a recuperare, ma in esecuzione
http_proxy=socks5://127.0.0.1:40000 ./test.py
sarà recuperare con successo http: // alcuni server / some-url . Quindi mi sembra che questa combinazione (certamente antica) yum / libcurl fornita con CentOS6 non stia impostando correttamente il tipo di proxy all'interno di libcurl. Penso che ciò che sta accadendo sia che PROXYTYPE stia impostando un proxy HTTP standard invece di identificare lo schema socks5: // all'interno dell'URL specificato nella variabile di ambiente http_proxy .
In ogni caso, la seguente patch su /usr/lib/python2.6/site-packages/urlgrabber/grabber.py ha funzionato per consentirmi di accedere ai repository http: // yum tramite un proxy SOCKS5. All'interno di PyCurlFileObject # _set_opts (self, opts = {}), aggiungi:
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)
intorno alla linea 1205, proprio prima
# ssl options
if self.scheme == 'https':
Con questo cambiamento,
http_proxy=socks5://127.0.0.1:40000 yum install <package_name>
si collega correttamente a tutti i miei repository http: // yum sull'altro lato del firewall attraverso il proxy ssh SOCKS5.
Naturalmente, si potrebbe esportare la variabile di ambiente http_proxy all'interno della propria shell per evitare di specificarla prima di ogni invocazione di yum .