Używam CentOS6.x z yum-3.2.29-81, curl / libcurl 7.19.7-53 i mam ten sam problem. Mam serwery yum za firewallem i chcę używać yum w konfiguracji proxy SOCKS5 za pomocą ssh. Idealnie chciałbym to zrobić bez konieczności używania tsocks, proxy lub innych narzędzi do „skarpetyzacji”.
Konfiguruję połączenie SOCKS5 za pomocą:
ssh -D 40000 dmz-server
Przeszukałem źródła yum Pythona i zobaczyłem, że używają pycurl, który otacza libcurl (należy również pamiętać, że wszystkie zmienne środowiskowe proxy - http_proxy, HTTP_PROXY, all_proxy, ALL_PROXY itp. - były początkowo niezdefiniowane). Ponadto zweryfikowałem, że ~ / .curlrc jest pusty, więc nie zepsuł moich wyników testu.
Chciałem sprawdzić, czy mogę skręcić, aby porozmawiać przez proxy Socks5:
curl --socks5 127.0.0.1:40000 http://some-server/some-url
pomyślnie zwrócił zdalną stronę internetową, więc był to dobry znak - pokazując, że libcurl może używać proxy SOCKS5. Jednak zdefiniowanie zmiennej środowiskowej
http_proxy=socks5://127.0.0.1:40000
nie wystarczyło:
http_proxy=socks5://127.0.0.1:40000 curl http://some-server/some-url
nie powiodło się
W tym momencie przełączyłem się na test.py w programie testowym Python :
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()
Teraz biegnę
./test.py
nie uda się pobrać, ale działa
http_proxy=socks5://127.0.0.1:40000 ./test.py
pomyślnie pobierze http: // some-server / some-url . Wydaje mi się więc, że ta (co prawda starożytna) kombinacja yum / libcurl, która jest dostarczana z CentOS6, nie ustawia poprawnie typu proxy w libcurl. Myślę, że dzieje się tak, że PROXYTYPE domyślnie korzysta ze standardowego proxy HTTP zamiast identyfikować schemat socks5: // w adresie URL określonym w zmiennej środowiskowej http_proxy .
W każdym razie następująca łatka do /usr/lib/python2.6/site-packages/urlgrabber/grabber.py działała, aby umożliwić mi dostęp do repozytoriów http: // yum przez proxy SOCKS5. W PyCurlFileObject # _set_opts (self, opts = {}) dodaj:
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)
wokół linii 1205, tuż przed
# ssl options
if self.scheme == 'https':
Dzięki tej zmianie
http_proxy=socks5://127.0.0.1:40000 yum install <package_name>
pomyślnie łączy się ze wszystkimi moimi repozytoriami http: // yum po drugiej stronie zapory poprzez proxy SOCKS5 ssh.
Oczywiście można wyeksportować zmienną środowiskową http_proxy do powłoki, aby uniknąć jej podawania przed każdym wywołaniem yum .