Я использую 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
Я покопался в источниках Python yum и увидел, что они используют pycurl, который оборачивает libcurl (также обратите внимание, что все переменные окружения прокси-сервера - http_proxy, HTTP_PROXY, all_proxy, ALL_PROXY и т. Д. Изначально не были определены). Кроме того, я проверил, что ~ / .curlrc был пуст, поэтому он не испортил мои результаты теста.
Я хотел посмотреть, смогу ли я заставить curl говорить через прокси 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 репозиториям на другой стороне брандмауэра через ssh-прокси SOCKS5.
Конечно, можно экспортировать переменную среды http_proxy в своей оболочке, чтобы избежать ее указания перед каждым вызовом yum .