Estou usando o CentOS6.x com yum-3.2.29-81, curl / libcurl 7.19.7-53 e tenho esse mesmo problema. Eu tenho servidores yum atrás de um firewall e quero usá-los em uma configuração de proxy SOCKS5 usando ssh. Idealmente, quero fazer isso sem exigir tsocks, proxychains ou qualquer outro utilitário de "socksification".
Eu configurei a conexão SOCKS5 usando:
ssh -D 40000 dmz-server
Eu procurei nas fontes yum python e vi que elas usam pycurl, que envolve a libcurl (observe também que todas as variáveis de ambiente proxy - http_proxy, HTTP_PROXY, all_proxy, ALL_PROXY etc.) foram inicialmente indefinidas). Além disso, verifiquei que o ~ / .curlrc estava vazio e não manchou os resultados dos meus testes.
Eu queria ver se conseguia curl para falar através do proxy socks5:
curl --socks5 127.0.0.1:40000 http://some-server/some-url
retornou com êxito a página da web remota, de modo que foi um bom sinal - mostrar que a libcurl pode usar proxies do SOCKS5. No entanto, definir uma variável de ambiente
http_proxy=socks5://127.0.0.1:40000
não foi suficiente:
http_proxy=socks5://127.0.0.1:40000 curl http://some-server/some-url
falhou.
Neste ponto, mudei para o uso de um programa de teste 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()
Agora correndo
./test.py
falhará ao buscar, mas executando
http_proxy=socks5://127.0.0.1:40000 ./test.py
buscará com êxito http: // some-server / some-url . Portanto, parece-me que essa combinação yum / libcurl (reconhecidamente antiga) fornecida com o CentOS6 não está configurando corretamente o tipo de proxy no libcurl. Acho que o que está acontecendo é que o PROXYTYPE está padronizando para um proxy HTTP padrão em vez de identificar o esquema socks5: // dentro da URL especificada na variável de ambiente http_proxy .
De qualquer forma, o seguinte patch para /usr/lib/python2.6/site-packages/urlgrabber/grabber.py funcionou para permitir o acesso aos repositórios http: // yum por meio de um proxy SOCKS5. No PyCurlFileObject # _set_opts (self, opts = {}), adicione:
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)
em torno da linha 1205, logo antes
# ssl options
if self.scheme == 'https':
Com essa mudança,
http_proxy=socks5://127.0.0.1:40000 yum install <package_name>
conecta com êxito a todos os meus repositórios http: // yum do outro lado do firewall por meio do proxy ssh SOCKS5.
Obviamente, pode-se exportar a variável de ambiente http_proxy dentro do shell para evitar especificá-la antes de cada chamada do yum .