根本原因是远程服务器上的vscode-server无法访问公网插件市场,因其默认直连marketplace.visualstudio.com且不继承shell环境变量;必须通过~/.vscode-server/data/machine/settings.json配置http.proxy才生效。

VSCode Remote-SSH 插件安装报 ECONNREFUSED 或 ERR_CONNECTION_TIMED_OUT
根本原因不是 VSCode 本身,而是远程服务器上运行的 vscode-server 进程无法访问公网插件市场。它默认走服务器本地网络直连 marketplace.visualstudio.com,而多数生产服务器禁止出向 HTTPS 流量或需走代理。
- 别在远程终端里手动运行
code --install-extension—— 这调用的是服务器本地未初始化的 VS Code CLI,和 Remote 模式无关 - 真正起作用的是你本地 VS Code 发起的下载请求,但二进制包最终由远程
vscode-server解压并加载,所以下载链路必须通到服务器端 - 验证方法:SSH 登录服务器后执行
curl -I https://marketplace.visualstudio.com,若返回Failed to connect就是网络卡点
让 vscode-server 走代理:配置 http.proxy 不生效?
Remote 场景下,VSCode 客户端的全局 http.proxy 设置(在 Settings UI 或 settings.json)只影响本地进程,不透传给远程 vscode-server。必须显式告诉远程服务用哪个代理。
- 在远程服务器的用户目录下创建/编辑
~/.vscode-server/data/Machine/settings.json(注意路径含Machine,不是User) - 写入:
{"http.proxy": "http://your-proxy:8080", "http.proxyStrictSSL": false} - 重启 Remote 连接(断开再重连),否则设置不加载;
vscode-server启动时才读这个文件 - 如果代理需认证,格式为
http://user:pass@proxy:8080,但注意密码含特殊字符要 URL 编码
离线安装插件:绕过网络直接部署 .vsix
适用于完全无外网、或代理策略极严的环境。核心是把插件文件(.vsix)手动传到服务器,并让 vscode-server 识别为已安装。
- 在能上网的机器上,从 marketplace 页面 找到「Download Extension」链接,得到
ms-python.python-2024.2.0.vsix这类文件 - 用
scp传到远程服务器任意位置,例如~/extensions/python.vsix - 在 VSCode 本地窗口按
Ctrl+Shift+P(Mac 为Cmd+Shift+P),运行命令:Extensions: Install from VSIX... - 选择本地路径——VSCode 会把该
.vsix上传到远程~/.vscode-server/extensions/并解压,之后立即生效
为什么改了 /etc/environment 或 ~/.bashrc 的 http_proxy 没用?
vscode-server 是由 SSH 启动的独立进程,不继承 shell 环境变量,也不读系统级代理配置。它只认自己配置文件里的 http.proxy,或你显式通过 code --proxy-server 启动(但 Remote 模式不支持该参数)。
- 不要试图在
/etc/environment里加http_proxy——vscode-server不加载它 - 不要在
~/.bashrc里 export 代理变量 —— SSH 的 non-interactive shell 不 source 这个文件 - 唯一可靠的配置入口就是
~/.vscode-server/data/Machine/settings.json - 如果服务器有 iptables/nftables 限制,记得放行代理端口(如
8080)和目标域名marketplace.visualstudio.com:443
最常被忽略的是路径里的 Machine —— 写成 User 或漏掉 data 目录,配置就完全不生效。服务器上检查该文件是否存在、权限是否可读,比反复试代理地址更省时间。











