WSL2 配置代理(SSH/GIT 可用)

发布于 2021-04-24  2,611 次阅读


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

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

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

# ProxyCommand nc -X connect -x 0.0.0.0:0 %h %p

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

Host github.com
User git
# ProxyCommand nc -X connect -x 0.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=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')
WSL_IP=$(hostname -I | awk '{print $1}')
PROXY_PORT=1089

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

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

    export https_proxy="${PROXY_HTTP}"
    export HTTPS_proxy="${PROXY_HTTP}"

    export ALL_PROXY="${PROXY_SOCKS5}"
    export all_proxy="${PROXY_SOCKS5}"

    git config --global http.proxy ${PROXY_HTTP}
    git config --global https.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 ${HOST_IP}:${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}
    git config --global --unset https.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:0 %h %p/" ~/.ssh/config
}

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

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

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

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


终有一日, 仰望星空