yum.conf 的手册页描述了几个与代理相关的变量:
Run Code Online (Sandbox Code Playgroud)proxy URL to the proxy server that yum should use. proxy_username username to use for proxy proxy_password password for this proxy
但是如何指定 SOCKS 代理呢?
我认为以上仅适用于普通的 HTTP 代理......
小智 25
将此行添加到/etc/yum.conf
(从 DaPillow 的帖子中得到想法)
proxy=socks5://ip:port
如果需要通过代理进行主机名解析,感谢评论中的丹尼,这将做到:
proxy=socks5h://ip:port
在 Fedora 21 上使用 yum 3.4.3 对我有用。
正如 enzitib 所指出的,tsocks
可用于将 SOCKS 代理与yum
.
更详细地说,可以像这样使用它:
$ export TSOCKS_CONF_FILE=$HOME/.tsocks.conf
$ cat .tsocks.conf
server = 127.0.0.1
server_port = 1080
$ tsocks yum ...
Run Code Online (Sandbox Code Playgroud)
默认情况下,tsocks 使用 SOCKS 版本 4 - 但您可以通过“server_type”指令配置 5。对于用户/密码选项,有 'default_user'/'default_pass' 指令和 TSOCKS_USERNAME/TSOCKS_PASSWORD 环境变量。
小智 5
我正在使用 CentOS6.x 和 yum-3.2.29-81、curl/libcurl 7.19.7-53 并且有同样的问题。我在防火墙后面有 yum 服务器,并且想在使用 ssh 的 SOCKS5 代理设置上使用 yum。理想情况下,我希望在不需要 tsocks、proxychains 或任何其他“socksification”实用程序的情况下执行此操作。
我使用以下方法设置 SOCKS5 连接:
ssh -D 40000 dmz-server
Run Code Online (Sandbox Code Playgroud)
我在 yum python 源代码中闲逛,看到它们使用包装 libcurl 的 pycurl(还请注意所有代理环境变量——http_proxy、HTTP_PROXY、all_proxy、ALL_PROXY 等——最初是未定义的)。此外,我确认 ~/.curlrc 是空的,所以它没有污染我的测试结果。
我想看看是否可以让 curl 通过 socks5 代理进行通话:
curl --socks5 127.0.0.1:40000 http://some-server/some-url
Run Code Online (Sandbox Code Playgroud)
成功返回远程网页,这是一个好兆头——显示 libcurl可以使用 SOCKS5 代理。但是,定义环境变量
http_proxy=socks5://127.0.0.1:40000
Run Code Online (Sandbox Code Playgroud)
还不够:
http_proxy=socks5://127.0.0.1:40000 curl http://some-server/some-url
Run Code Online (Sandbox Code Playgroud)
失败的。
此时,我切换到使用 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()
Run Code Online (Sandbox Code Playgroud)
现在,运行
./test.py
Run Code Online (Sandbox Code Playgroud)
将无法获取,但正在运行
http_proxy=socks5://127.0.0.1:40000 ./test.py
Run Code Online (Sandbox Code Playgroud)
将成功获取http://some-server/some-url。所以在我看来,CentOS6 附带的这个(公认的古老)yum/libcurl 组合没有正确设置 libcurl 中的代理类型。我认为正在发生的事情是 PROXYTYPE 默认为标准 HTTP 代理,而不是在http_proxy环境变量中指定的 URL 中识别 socks5:// 方案。
无论如何,/usr/lib/python2.6/site-packages/urlgrabber/grabber.py 的以下补丁允许我通过 SOCKS5 代理访问 http:// yum 存储库。在 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)
Run Code Online (Sandbox Code Playgroud)
在 1205 行附近,就在之前
# ssl options
if self.scheme == 'https':
Run Code Online (Sandbox Code Playgroud)
有了这个变化,
http_proxy=socks5://127.0.0.1:40000 yum install <package_name>
Run Code Online (Sandbox Code Playgroud)
通过 SOCKS5 ssh 代理成功连接到防火墙另一侧的所有 http:// yum 存储库。
当然,可以在自己的 shell 中导出http_proxy环境变量,以避免在每次调用yum之前指定它。