hg 克隆无法访问网络

Network is unreachable for hg clone

我的firefox安装了autoproxy,购买了vps服务后,所有网页都可以通过socket5代理服务浏览。

apt-get install mercurial  #on my local pc
hg clone https://vim.googlecode.com/hg/   /tmp/vim  #on my local pc
abort: error: Network is unreachable

https://vim.googlecode.com/hg/可以通过Firefox中的autoproxy访问
如何在我的远程 VPS 上构建某种代理服务以使 hg clone 命令到达 https://vim.googlecode.com/hg/?

不是所有的网站都可以在这里访问,我已经搭建了一个通过Firefox访问它们的阶梯。

如何在我的 VPS(在远程 PC 上)上制作另一个梯子以在我的本地 PC 上制作 hg clone 命令 运行?

每次我用我的 VPS 和 Firefox 做梯子时都是这样:

  1. 在本地电脑输入ssh命令

    ssh -D 127.0.0.1:1080  -p 1234 root@44.44.44.44
    
  2. 点击Autoproxy插件进入全局模式。它在 Socket 5 代理中设置为良好状态。

  3. 现在我可以去我想去的地方了

如何编写hg clone命令?

我建议从配置本地 Mercurial 实例的代理设置开始。检查 hg help config 并在那里寻找代理。

"http_proxy"
------------

Used to access web-based Mercurial repositories through a HTTP proxy.

"host"
    Host name and (optional) port of the proxy server, for example
    "myproxy:8000".

"no"
    Optional. Comma-separated list of host names that should bypass the
    proxy.

"passwd"
    Optional. Password zur Authentifikation mit einem Proxy-Server.

"user"
    Optional. User name to authenticate with at the proxy server.

"always"
    Optional. Always use the proxy, even for localhost and any entries in
    "http_proxy.no". (default: False)

要为 Mercurial 使用代理,您可以在命令前加上 http_proxy:

http_proxy=http://proxy-server:8080 hg clone https://vim.googlecode.com/hg

或者在你的~/.hgrc中配置为:

[http_proxy]
host=proxy-host:port
user=username
passwd=password

由于您使用的是 SOCKS5 代理,因此 Mercurial(撰写本文时为 3.7.2)尚不支持此功能,但是下面有 an extension for it based on the patch

扩展

您可以下载 Mercurial DVCS 的小扩展以启用 SOCKS5 代理:https://bitbucket.org/bugheisen/socks_proxy

因此可以在 ~/.hgrc 中将代理配置为:

[extensions]
socks_proxy = /path/to/socks_proxy.py

[socks_proxy]
host = localhost:9150

To experiment with a SOCKS5 proxy you can use the -D option of SSH, which creates such a proxy that runs over the SSH connection. Alternatively you can run Tor, which also starts a SOCKS5 proxy (probably either on port 9050 or port 9150).

补丁

以上扩展是基于Bug Heisen发布的原始补丁,您可以根据下面的代码downloading the source code of Mercurial and applying this patch申请:

diff -r 12f161f08d74 -r 3f58227755ed mercurial/url.py
--- a/mercurial/url.py  Tue Apr 01 23:41:32 2014 -0700
+++ b/mercurial/url.py  Sun Apr 06 16:16:02 2014 +0200
@@ -63,6 +63,44 @@

 class proxyhandler(urllib2.ProxyHandler):
     def __init__(self, ui):
+
+        # First, check if a SOCKS5 proxy is set, using a line 'host = ...' in 
+        # the [socks_proxy] section of the config file.
+
+        proxyurl = ui.config("socks_proxy", "host")
+
+        if proxyurl:
+            idx = proxyurl.find(":")
+            if idx < 0:
+                raise util.Abort(_("host in socks_proxy should be "
+                                   "hostname:port"))
+
+            host = proxyurl[:idx]
+            portstr = proxyurl[idx+1:]
+            try:
+                port = int(portstr)
+            except ValueError:
+                raise util.Abort(_("Cannot interpret '%s' in the socks_proxy "
+                                   "host line as an integer port number") 
+                                   % portstr)
+
+            if port <= 0 or port > 65535:
+                raise util.Abort(_("Port number in socks_proxy host line "
+                                   "must lie between 1 and 65535, but is "
+                                   "%d") % port)
+
+            ui.note("Setting SOCKS5 proxy to %s:%d\n" % (host, port))
+                    
+            try:
+                import socks
+                socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, host, port)
+                socket.socket = socks.socksocket
+            except ImportError:
+                raise util.Abort(_("The SocksiPy socks module is needed for "
+                                   "SOCKS support"))
+
+        # Then check for a http/https proxy
+        
         proxyurl = ui.config("http_proxy", "host") or os.getenv('http_proxy')
         # XXX proxyauthinfo = None

然后在您的 ~/.hgrc 中使用 socks_proxy 而不是 http_proxy(如上所示)。

关于这个补丁的原始注释:

This patch adds support for a SOCKS5 proxy, using the 'socks' module from the SocksiPy projects (needs to be installed separately). Because it is the 'proxyhandler' function that is modified, it will only work for HTTP/HTTPS protocols. For the SSH protocol, using a SOCKS proxy can easily be done outside of Mercurial, by specifying the ProxyCommand option.

The patch has the SOCKS5 version hardcoded in it, but the socks module should support other versions as well. So other SOCKS versions are possible in the same way, but the code would require modification to support them.

For testing purposes, it's good to know that SSH can create a SOCKS5 proxy using the -D command line flag. Using Tor also generates such a proxy, typically either on port 9050 or 9150.