Tôi đang sử dụng CentOS6.x với yum-3.2,29-81, curl / libcurl 7.19.7-53 và có vấn đề tương tự. Tôi có các máy chủ yum phía sau tường lửa và muốn sử dụng yum qua thiết lập proxy SOCKS5 bằng ssh. Lý tưởng nhất, tôi muốn làm điều này mà không yêu cầu tsocks, proxy, hoặc bất kỳ tiện ích "vớ hóa" nào khác.
Tôi thiết lập kết nối SOCKS5 bằng cách sử dụng:
ssh -D 40000 dmz-server
Tôi đã tìm kiếm trong các nguồn python yum và thấy họ sử dụng pycurl để bọc libcurl (cũng xin lưu ý rằng tất cả các biến môi trường proxy - http_proxy, HTTP_PROXY, all_proxy, ALL_PROXY, v.v .-- ban đầu không được xác định). Hơn nữa, tôi đã xác minh rằng ~ / .curlrc trống nên nó không làm mờ kết quả kiểm tra của tôi.
Tôi muốn xem liệu tôi có thể có được curl để nói chuyện qua proxy vớ5 không:
curl --socks5 127.0.0.1:40000 http://some-server/some-url
đã trả về thành công trang web từ xa, vì vậy đó là một dấu hiệu tốt - hiển thị libcurl có thể sử dụng proxy SOCKS5. Tuy nhiên, xác định một biến môi trường
http_proxy=socks5://127.0.0.1:40000
chưa đủ:
http_proxy=socks5://127.0.0.1:40000 curl http://some-server/some-url
thất bại.
Tại thời điểm này, tôi đã chuyển sang sử dụng chương trình kiểm tra Python test.txt :
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()
Bây giờ, đang chạy
./test.py
sẽ không tải được, nhưng đang chạy
http_proxy=socks5://127.0.0.1:40000 ./test.py
sẽ tìm nạp thành công http: // some-server / some-url . Vì vậy, dường như đối với tôi, sự kết hợp yum / libcurl (được thừa nhận là cổ xưa) mà các tàu với CentOS6 không đặt chính xác loại proxy trong libcurl. Tôi nghĩ điều đang xảy ra là PROXYTYPE đang mặc định là proxy HTTP tiêu chuẩn thay vì xác định lược đồ vớ5: // trong URL được chỉ định trong biến môi trường http_proxy .
Trong mọi trường hợp, bản vá sau đây cho /usr/lib/python2.6/site-packages/urlgrabber/grabber.py đã hoạt động để cho phép tôi truy cập kho lưu trữ http: // yum thông qua proxy SOCKS5. Trong PyCurlFileObject # _set_opts (self, opts = {}), thêm:
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)
khoảng dòng 1205, ngay trước
# ssl options
if self.scheme == 'https':
Với sự thay đổi này,
http_proxy=socks5://127.0.0.1:40000 yum install <package_name>
kết nối thành công với tất cả các kho lưu trữ http: // yum của tôi ở phía bên kia của tường lửa thông qua proxy SshS5 ssh.
Tất nhiên, người ta có thể xuất biến môi trường http_proxy trong vỏ của một người để tránh chỉ định nó trước mỗi lần gọi yum .