Ich verwende CentOS6.x mit yum-3.2.29-81, curl / libcurl 7.19.7-53 und habe das gleiche Problem. Ich habe YUM-Server hinter einer Firewall und möchte YUM über ein SOCKS5-Proxy-Setup mit SSH verwenden. Im Idealfall möchte ich dies tun, ohne T-Socks, Proxy-Ketten oder andere "Socksification" -Dienstprogramme zu benötigen.
Ich richte die SOCKS5-Verbindung ein mit:
ssh -D 40000 dmz-server
Ich stöberte in den YUM-Python-Quellen herum und sah, dass sie Pycurl verwenden, das Libcurl umschließt. Außerdem habe ich überprüft, dass ~ / .curlrc leer ist, damit meine Testergebnisse nicht beeinträchtigt werden.
Ich wollte sehen, ob ich Curl dazu bringen könnte, über den socks5-Proxy zu sprechen:
curl --socks5 127.0.0.1:40000 http://some-server/some-url
erfolgreich zurückgegeben die Remote - Web - Seite, so dass ein gutes Zeichen - zeigt libcurl kann SOCKS5 Proxies verwenden. Definieren Sie jedoch eine Umgebungsvariable
http_proxy=socks5://127.0.0.1:40000
war nicht genug:
http_proxy=socks5://127.0.0.1:40000 curl http://some-server/some-url
gescheitert.
Zu diesem Zeitpunkt wechselte ich zu einem Python-Testprogramm 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()
Jetzt renn
./test.py
wird nicht abrufen, aber ausgeführt
http_proxy=socks5://127.0.0.1:40000 ./test.py
wird erfolgreich http: // some-server / some-url holen . Aus diesem Grund scheint mir diese (zugegebenermaßen uralte) Kombination aus yum und libcurl, die im Lieferumfang von CentOS6 enthalten ist, den Proxy-Typ in libcurl nicht korrekt einzustellen. Ich denke, was passiert ist, dass der PROXYTYPE standardmäßig einen Standard-HTTP-Proxy verwendet, anstatt das Schema socks5: // in der URL zu identifizieren, die in der Umgebungsvariablen http_proxy angegeben ist.
Mit dem folgenden Patch für /usr/lib/python2.6/site-packages/urlgrabber/grabber.py konnte ich auf jeden Fall über einen SOCKS5-Proxy auf http: // yum-Repositorys zugreifen. Fügen Sie in PyCurlFileObject # _set_opts (self, opts = {}) Folgendes hinzu:
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)
um die Linie 1205 herum, direkt davor
# ssl options
if self.scheme == 'https':
Mit dieser Änderung
http_proxy=socks5://127.0.0.1:40000 yum install <package_name>
stellt über den SOCKS5-SSH-Proxy erfolgreich eine Verbindung zu allen meinen http: // yum-Repositorys auf der anderen Seite der Firewall her.
Natürlich kann man die Umgebungsvariable http_proxy innerhalb der eigenen Shell exportieren , um zu vermeiden, dass sie vor jedem Aufruf von yum angegeben wird .