Saya menggunakan CentOS6.x dengan yum-3.2.29-81, curl / libcurl 7.19.7-53 dan memiliki masalah yang sama. Saya memiliki server yum di belakang firewall dan ingin menggunakan yum melalui pengaturan proxy SOCKS5 menggunakan ssh. Idealnya, saya ingin melakukan ini tanpa memerlukan tsocks, proxychains, atau utilitas "socksification" lainnya.
Saya mengatur koneksi SOCKS5 menggunakan:
ssh -D 40000 dmz-server
Saya mencari-cari di sumber python yum dan melihat mereka menggunakan pycurl yang membungkus libcurl (juga harap dicatat bahwa semua variabel lingkungan proxy - http_proxy, HTTP_PROXY, all_proxy, ALL_PROXY, dll. - pada awalnya tidak terdefinisi). Selanjutnya, saya memverifikasi bahwa ~ / .curlrc kosong sehingga tidak mencemari hasil pengujian saya.
Saya ingin melihat apakah saya bisa mendapatkan curl untuk berbicara melalui proxy socks5:
curl --socks5 127.0.0.1:40000 http://some-server/some-url
berhasil mengembalikan halaman web jarak jauh, jadi itu pertanda baik - menunjukkan libcurl dapat menggunakan proxy SOCKS5. Namun, mendefinisikan variabel lingkungan
http_proxy=socks5://127.0.0.1:40000
tidak cukup:
http_proxy=socks5://127.0.0.1:40000 curl http://some-server/some-url
gagal.
Pada titik ini, saya beralih menggunakan program uji 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()
Sekarang, berjalan
./test.py
akan gagal mengambil, tetapi berjalan
http_proxy=socks5://127.0.0.1:40000 ./test.py
akan berhasil mengambil http: // some-server / some-url . Jadi sepertinya bagi saya bahwa kombinasi yum / libcurl (diakui kuno) yang dikirimkan dengan CentOS6 ini tidak dengan benar menyetel tipe proxy dalam libcurl. Saya pikir apa yang terjadi adalah bahwa PROXYTYPE default ke proxy HTTP standar alih-alih mengidentifikasi skema socks5: // dalam URL yang ditentukan dalam variabel lingkungan http_proxy .
Dalam keadaan apa pun, tambalan berikut ke /usr/lib/python2.6/site-packages/urlgrabber/grabber.py berfungsi agar saya dapat mengakses http: // yum repositori melalui proxy SOCKS5. Di dalam PyCurlFileObject # _set_opts (self, opts = {}), tambahkan:
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)
sekitar baris 1205, tepat sebelumnya
# ssl options
if self.scheme == 'https':
Dengan perubahan ini,
http_proxy=socks5://127.0.0.1:40000 yum install <package_name>
berhasil terhubung ke semua repositori http: // yum saya di sisi lain firewall melalui proxy ssh SOCKS5.
Tentu saja, seseorang dapat mengekspor variabel lingkungan http_proxy di dalam shell seseorang untuk menghindari menentukannya sebelum setiap doa yum .