本篇文章包含了将 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 个命令:
- set_proxy, 设置和代理有关的几个环境变量, 同时配置 GIT 使用 HTTP 代理. 当然, 如果使用 SSH 访问 GitHub, 配置 GIT 的 HTTP 代理是无效的, 需要修改 ~/.ssh/config 文件. 这里是通过正则表达式完成这一目的的.
- unset_proxy, 取消所有的代理设置.
- test_proxy, 显示当前的代理设置.
你可以直接把上述几行加入 ~/.bashrc (或者是 ~/.zshrc) 中, 也可以考虑像我一样单独写入一个脚本 ~/proxy.sh, 然后在 ~/.bashrc (~/.zshrc) 中添加一个命令 . ~/proxy.sh, 这样可以让 ~/.bashrc (~/.zshrc) 看起来更加简洁一点.
Comments | 6 条评论
export all_proxy="${PROXY_SOCKS5}" 需要加上双引号
然后如果是 clash,默认端口号需要改一下
PROXY_PORT=7890
.bashrc 和 .zshrc 中调用函数跟 shell 一样,直接写一下函数名就好
set_proxy
@Jackiexiao 谢谢提醒,错误已修改
我修改了一个fish版本
本机hyper-V装个openwrt当旁路由,本地连接和openwrt统一走新建的虚拟交换机(假如命名为"wlan"),WSL可以方便的开心上网,本机更改适配器中,配置这个叫"vEthernet (WAN)"的ipv4,将网关和dns均指向openwrt的ip即可。
@zoand 好办法,学习了!
说道获取主机 ip,我之前折腾 WSL 的时候是用了 nss-myhostname 这个 nss 插件。
这样子直接设置代理是
_gateway:port
就行了。当然问题是 nss 插件对于不鸟 glibc 的程序没有用 说的就是你 golang