ฉันใช้ CentOS6.x กับ yum-3.2.29-81, curl / libcurl 7.19.7-53 และมีปัญหาเดียวกันนี้ ฉันมีเซิร์ฟเวอร์ yum อยู่หลังไฟร์วอลล์และต้องการใช้ yum ผ่านการตั้งค่าพร็อกซี SOCKS5 โดยใช้ ssh เป็นการดีที่ฉันต้องการทำสิ่งนี้โดยไม่ต้องใช้อุปกรณ์ tsocks, proxychains หรือยูทิลิตี้ "ถุงเท้า" อื่น ๆ
ฉันตั้งค่าการเชื่อมต่อ SOCKS5 โดยใช้:
ssh -D 40000 dmz-server
ฉันแหย่ไปรอบ ๆ ในแหล่ง yum python และเห็นว่าพวกเขาใช้ pycurl ซึ่งล้อม libcurl (โปรดทราบว่าตัวแปรสภาพแวดล้อมพร็อกซีทั้งหมด - http_proxy, HTTP_PROXY, all_proxy, ALL_PROXY, เป็นต้น - ไม่ได้กำหนดไว้ในตอนแรก) นอกจากนี้ฉันตรวจสอบแล้วว่า ~ / .curlrc ว่างเปล่าดังนั้นจึงไม่ทำให้ผลการทดสอบของฉันมัวหมอง
ฉันต้องการที่จะดูว่าฉันจะได้ขดที่จะพูดคุยผ่าน proxy5 proxy:
curl --socks5 127.0.0.1:40000 http://some-server/some-url
ส่งคืนรีโมตเว็บเพจสำเร็จดังนั้นนั่นเป็นสัญญาณที่ดี - การแสดง libcurl สามารถใช้พรอกซี SOCKS5 อย่างไรก็ตามการกำหนดตัวแปรสภาพแวดล้อม
http_proxy=socks5://127.0.0.1:40000
ไม่เพียงพอ:
http_proxy=socks5://127.0.0.1:40000 curl http://some-server/some-url
ล้มเหลว
ณ จุดนี้ฉันเปลี่ยนไปใช้โปรแกรมทดสอบ 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()
ตอนนี้ทำงาน
./test.py
จะไม่สามารถดึงข้อมูลได้ แต่ทำงานอยู่
http_proxy=socks5://127.0.0.1:40000 ./test.py
จะดึงข้อมูลhttp: // some-server / some-urlได้สำเร็จ ดังนั้นสำหรับฉันแล้วการรวมกัน yum / libcurl (ที่ยอมรับกันมานานนี้) ที่มาพร้อมกับ CentOS6 นั้นไม่ได้ตั้งค่าประเภทพร็อกซีภายใน libcurl ไม่ถูกต้อง ฉันคิดว่าสิ่งที่เกิดขึ้นคือ PROXYTYPE เริ่มต้นเป็นพร็อกซี HTTP มาตรฐานแทนการระบุชุดรูปแบบ socks5: // ภายใน URL ที่ระบุในตัวแปรสภาพแวดล้อมhttp_proxy
ไม่ว่าในกรณีใดแพทช์ต่อไปนี้เพื่อ /usr/lib/python2.6/site-packages/urlgrabber/grabber.py ทำงานเพื่ออนุญาตให้ฉันเข้าถึงที่เก็บ http: // yum ผ่านพร็อกซี SOCKS5 ภายใน PyCurlFileObject # _set_opts (self, opts = {}) ให้เพิ่ม:
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)
รอบเส้น 1205 ก่อนหน้านี้
# ssl options
if self.scheme == 'https':
ด้วยการเปลี่ยนแปลงนี้
http_proxy=socks5://127.0.0.1:40000 yum install <package_name>
เชื่อมต่อกับที่เก็บ http: // yum ทั้งหมดของฉันที่ด้านอื่น ๆ ของไฟร์วอลล์ผ่าน SOCKS5 ssh proxy ได้อย่างสมบูรณ์
แน่นอนหนึ่งสามารถส่งออกhttp_proxyตัวแปรสภาพแวดล้อมภายในเปลือกของคนที่จะหลีกเลี่ยงการระบุไว้ก่อนภาวนาของแต่ละyum