WSL 中 Copilot 无法工作的代理配置与网络互访方案
问题表现
如果你有以下问题之一:

- 对话没有输出

- 显示 fetch failed

- 模型名称不显示

问题分析
查看 copilot chat 的 output 显示:


如果显示 proxies 相关问题,可以确定是 WSL 中运行的 vscode 调用了宿主机的 proxy 设置的问题。

解决 VS Code Remote 连接 WSL 时 GitHub Copilot 因代理设置失效的问题。原因为 WSL 继承宿主机本地代理(127.0.0.1)导致无法访问。解决方案包括关闭 VS Code 本地代理配置,或获取宿主机 IP 并配置代理脚本,使 WSL 能通过宿主机 IP 访问代理端口。

如果你有以下问题之一:




查看 copilot chat 的 output 显示:


如果显示 proxies 相关问题,可以确定是 WSL 中运行的 vscode 调用了宿主机的 proxy 设置的问题。


微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
这个选项似乎是默认开启的,会在 vscode 远程连接 wsl 开发中继承宿主机的 proxy 本地设置。问题就出在这里,如果你使用的是宿主机本机运行的代理程序,那么 proxy 的 ip 就会设置为 127.0.0.1,但是在 wsl 中想要访问宿主机的代理端口,ip 并不是 127.0.0.1(这会访问到 wsl 自己),而是需要通过如下方式查询宿主机 ip,然后访问到宿主机上的代理端口:
hostip=$(ip route show |grep -i default |awk'{ print $3}')
echo $hostip
我的输出:
172.25.48.1
因此 wsl 中要通过 172.25.48.1 ip 来访问宿主机上的端口。
WSL 2 / VS Code RemoteWindows Host (宿主机)Listens on Port XListens on Port XReturns 172.25.48.1Default Proxy: 127.0.0.1X Connection Refused (Self)✅ Correct Proxy: 172.25.48.1:Port XTraffic ForwardedWSL ApplicationLoopback: 127.0.0.1Query: ip route show | awk '{ print $3}'Proxy AppHost IP: 172.25.48.1Loopback: 127.0.0.1
http: Use Local Proxy Configuration.
你可能见过这个方案:Stack Overflow 上关于 Copilot 在 WSL remote connection 不可用的讨论。该方案虽然有效,但副作用是 copilot 无法修改 WSL 中的文件,agent 模式将形同虚设,因为你设置 copilot 完全工作在宿主机上(即设置的
"GitHub.copilot": [ "ui" ])。
上面已经说明了如何在 WSL 命令行中访问宿主机程序,那么我们可以将之应用到代理设置上,以下脚本解决了一个问题——在 wsl 命令行中如何利用宿主机代理软件?
#!/bin/sh
hostip=$(ip route show |grep -i default |awk'{ print $3}')
wslip=$(hostname -I |awk'{print $1}')
port=7890
PROXY_HTTP="http://${hostip}:${port}"
PROXY_SOCKS5="socks5://${hostip}:${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.https://github.com.proxy ${PROXY_HTTP}
git config --global https.https://github.com.proxy ${PROXY_HTTP}
echo "Proxy has been opened."
}
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.https://github.com.proxy
git config --global --unset https.https://github.com.proxy
echo "Proxy has been closed."
}
test_setting(){
echo "Host IP:"${hostip}
echo "WSL IP:"${wslip}
echo "Try to connect to Google..."
resp=$(curl -I -s --connect-timeout 5 -m 5 -w "%{http_code}" -o /dev/null www.google.com)
if [ "${resp}" = "200" ]; then
echo "Proxy setup succeeded!"
else
echo "Proxy setup failed!"
fi
}
if [ "$1" = "set" ]; then
set_proxy
elif [ "$1" = "unset" ]; then
unset_proxy
elif [ "$1" = "test" ]; then
test_setting
else
echo "Unsupported arguments."
fi
这个脚本自动获取宿主机的 ip,并利用宿主机上的本地代理软件来代理 wsl 中的网络请求,可以通过参数控制行为:
source proxy.sh set
# 开启代理,设置代理变量
source proxy.sh test
# 用 google.com 测试代理是否成功
source proxy.sh unset
# 关闭代理,清除代理变量设置