Contents

WSL2 配置代理 (SSH-Git 可用)

Contents

本篇文章包含了将 Windows 宿主的代理程序给 WSL2 使用的方法。 由于 GitHub 逐渐废弃掉密码登录,因此使用 SSH 访问 GitHub 是也常常需要代理。 本文一并将设置 SSH 代理的功能包含在脚本中。

话不多说,上脚本。 该脚本是基于这个网站的内容改的。

注意!!! 该脚本如果要正常使用,你可能需要先在 ~/.ssh/config 文件中添加一行:

ProxyCommand nc -X connect -x 0.0.0.0 %h %p

至于这一行加在哪里,这个可以自行决定。 可以加在第一行,这样全局都可以用,也可以加在某个 Host 下,这里其实我推荐只加在 github.com 这一个 Host 之下,例如:

User git
# ProxyCommand nc -X connect -x 0.0.0.0 %h %p

这样做有一个好处: 不干扰别的情形下 ssh 的使用。 比如说我,因为我很懒,我的 ssh_config 文件是 Windows/WSL 共用一份的,WSL 里面实际上是软链接。 设置成全局的就会导致我 Windows 上所有 ssh 都需要执行 nc 这个命令,会出错(因为在Windows 上你需要的不是 nc 而是 wsl nc)。 当然了,就算设置到 github.com,在你通过 Windows 上的 ssh clone 的时候还是会出错,所以说。。。只能说我在 WSL 里面克隆的时候更多。

此外,脚本中设定的代理的端口这里我设置的是 1089,按需要自己修改。

HOST_IP=2 }')
WSL_IP=1}')
PROXY_PORT=1089

PROXY_HTTP="http://{PROXY_PORT}"
PROXY_SOCKS5="socks5://{PROXY_PORT}"

set_proxy(){
    export http_proxy="{PROXY_HTTP}"

    export https_proxy="{PROXY_HTTP}"

    export ALL_PROXY="{PROXY_SOCKS5}"

    git config --global http.proxy {PROXY_HTTP}

    # git ssh proxy
    sed -i "s/# ProxyCommand/ProxyCommand/" ~/.ssh/config
    sed -i -E "s/ProxyCommand nc -X connect -x [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+ %h %p/ProxyCommand nc -X connect -x {PROXY_PORT} %h %p/" ~/.ssh/config
}

unset_proxy(){
    unset http_proxy
    unset HTTP_PROXY
    unset https_proxy
    unset HTTPS_PROXY
    unset ALL_PROXY
    unset all_proxy

    git config --global --unset http.proxy {PROXY_HTTP}

    sed -i -E "s/ProxyCommand nc -X connect -x [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+ %h %p/# ProxyCommand nc -X connect -x 0.0.0.0 %h %p/" ~/.ssh/config
}

test_proxy(){
    echo "Host ip:" {WSL_IP}
    echo "Current proxy:" ${https_proxy}
}

解释一下,这个脚本提供了 3 个命令:

  • set_proxy: 设置和代理有关的几个环境变量,同时配置 GIT 使用 HTTP 代理。 当然,如果使用 SSH 访问 GitHub,配置 GIT 的 HTTP 代理是无效的,需要修改 ~/.ssh/config 文件。 这里是通过正则表达式完成这一目的的。
  • unset_proxy: 取消所有的代理设置。
  • test_proxy: 显示当前的代理设置。

你可以直接把上述几行加入 ~/.bashrc (或者是 ~/.zshrc) 中,也可以考虑像我一样单独写入一个脚本 ~/proxy.sh,然后在 ~/.bashrc (~/.zshrc) 中添加一个命令 . ~/proxy.sh,这样可以让 ~/.bashrc (~/.zshrc) 看起来更加简洁一点。