Я використовую CentOS6.x з yum-3.2.29-81, curl / libcurl 7.19.7-53 і маю цю проблему. У мене є брандмауер yum-серверів і хочу використовувати yum через налаштування проксі-сервера SOCKS5 за допомогою ssh. В ідеалі я хочу це зробити, не вимагаючи tsocks, proxychains або будь-яких інших утиліт "socksification".
Я встановлюю з'єднання SOCKS5 за допомогою:
ssh -D 40000 dmz-server
Я поскакував у джерелах yum python і побачив, що вони використовують pycurl, який обертає libcurl (також врахуйте, що всі змінні середовища проксі - http_proxy, HTTP_PROXY, all_proxy, ALL_PROXY тощо) були спочатку невизначені). Крім того, я переконався, що ~ / .curlrc порожній, тому він не загрожує результатам моїх тестів.
Я хотів побачити, чи зможу я завитись, щоб поговорити через proxy socks5:
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.
Звичайно, можна експортувати змінну середовища http_proxy в оболонку, щоб не вказати її перед кожним викликом yum .