问题现象
在使用 VS Code Remote 连接 WSL 开发时,GitHub Copilot 经常无法正常工作。常见表现包括:
- 对话没有输出
- 显示
fetch failed错误 - 模型名称不显示
查看 Copilot Chat 的 Output 面板,通常会看到与 proxies 相关的报错信息。
原因分析
问题的核心在于 WSL 环境中运行的 VS Code 默认继承了宿主机的代理设置。如果宿主机使用的是本地代理程序(如 Clash、V2Ray 等),其监听地址通常是 127.0.0.1。
在 WSL 内部访问 127.0.0.1 指向的是 WSL 自己的网络栈,而不是宿主机。因此,WSL 无法连接到宿主机的代理端口,导致请求失败。
要解决这个问题,需要找到宿主机的 IP 地址,让 WSL 通过该 IP 访问宿主机的代理服务。在 WSL 终端执行以下命令即可获取宿主机 IP:
ip route show | grep -i default | awk '{ print $3 }'
假设输出为 172.25.48.1,那么 WSL 中的代理地址应配置为该 IP 而非 127.0.0.1。
解决方案
方案一:关闭本地代理配置
如果不需要全局代理,可以直接在 VS Code 设置中关闭 http: Use Local Proxy Configuration。
方案二:手动指定宿主机 IP
如果必须使用代理,需要在 VS Code 的设置中修改代理地址,将 127.0.0.1 替换为上述查询到的宿主机 IP。
注意:网上有一种方案建议将 Copilot 完全限制在宿主机运行(例如设置
"GitHub.copilot": [ "ui" ])。虽然能解决连接问题,但这会导致 Copilot 无法直接修改 WSL 内的文件,Agent 模式失效,体验大打折扣。
自动化脚本辅助
为了方便管理,可以编写一个 Shell 脚本来自动获取宿主机 IP 并配置环境变量。这样既能保证 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=""
HTTPS_proxy=
ALL_PROXY=
all_proxy=
git config --global http.https://github.com.proxy
git config --global https.https://github.com.proxy
}
() {
http_proxy
HTTP_PROXY
https_proxy
HTTPS_PROXY
ALL_PROXY
all_proxy
git config --global -- http.https://github.com.proxy
git config --global -- https.https://github.com.proxy
}
() {
resp=$(curl -I -s --connect-timeout 5 -m 5 -w -o /dev/null www.google.com)
[ = ];
}
[ = ];
set_proxy
[ = ];
unset_proxy
[ = ];
test_setting


