本质是vscode remote-ssh插件在服务器端下载vscode-server失败,主因包括服务器无法访问update.code.visualstudio.com、$home不可写、~/.vscode-server被锁或代理未正确继承。

为什么卡在 “Downloading VS Code Server” 这一步
本质是 VSCode Remote-SSH 插件在目标服务器上拉取并安装 vscode-server 二进制包失败,不是本地网络慢,而是服务器端下载受阻或权限/路径异常。常见现象包括:终端卡住不动、日志里反复出现 Downloading VS Code Server、过几分钟后报 Failed to download vscode-server 或直接超时断开。
根本原因通常是以下之一:
– 服务器无法访问 update.code.visualstudio.com
– 服务器上 $HOME 不可写(比如用 root 登录但 /root 权限受限)
– ~/.vscode-server 被旧版本残留文件锁死
– 代理配置只设在本地 shell,没被 Remote-SSH 进程继承
手动下载 + 离线部署 vscode-server
绕过自动下载最稳的方式:自己找对版本、传上去、解压到位。关键点是版本号必须和本地 VSCode 完全一致(差一个 patch 都会拒绝启动)。
- 在本地 VSCode 中打开命令面板(
Ctrl+Shift+P),运行Remote-SSH: Show Log,第一行就能看到类似6c3e3dba23e8fadc360aed4b995217d58e3aa259的 commit ID - 拼出下载地址:
https://update.code.visualstudio.com/commit:<code>6c3e3dba23e8fadc360aed4b995217d58e3aa259/server-linux-x64/stable(注意末尾/stable不可少) - 用
wget或浏览器下载 tar.gz 包,再通过scp传到服务器的临时目录(比如/tmp/vscode-server.tar.gz) - 在服务器上执行:
mkdir -p ~/.vscode-server/bin/6c3e3dba23e8fadc360aed4b995217d58e3aa259 tar -xzf /tmp/vscode-server.tar.gz -C ~/.vscode-server/bin/6c3e3dba23e8fadc360aed4b995217d58e3aa259 --strip-components 1
- 确保
~/.vscode-server/bin/6c3e3dba23e8fadc360aed4b995217d58e3aa259下有bin/code-server文件,且可执行(chmod +x bin/code-server)
检查并修复服务器端环境问题
即使下载成功,启动 code-server 进程仍可能失败,导致下次连接又重试下载。重点排查:
-
$HOME目录是否可写?用ls -ld ~看权限,尤其避免dr-xr-xr-x(只读);若用sudo ssh,改用普通用户登录 -
~/.vscode-server是否被占用?执行lsof -i :0(或查ps aux | grep code)看有没有残留进程,用pkill -f code-server清掉 - 服务器是否禁用了
fork()?某些容器或加固系统会限制,表现为日志中出现FATAL ERROR: pthread_create failed;此时需换用支持 fork 的基础镜像或主机环境 - 磁盘空间是否足够?
df -h ~查看,vscode-server解压后约 150MB,但临时解压需要双倍空间
让 Remote-SSH 正确继承代理设置
如果服务器本身不能直连外网,但你配了 HTTP 代理,Remote-SSH 默认不会读取 ~/.bashrc 里的 export http_proxy=...,因为它用的是非交互式 shell 启动。
- 在服务器上编辑
~/.ssh/environment(若不存在则新建),加入:http_proxy=http://your-proxy:port https_proxy=http://your-proxy:port
- 确保
/etc/ssh/sshd_config中有PermitUserEnvironment yes,然后重启sshd - 更简单的方法:在本地 VSCode 的
settings.json中加:"remote.SSH.env": { "http_proxy": "http://your-proxy:port", "https_proxy": "http://your-proxy:port" } - 注意:代理地址不能带
https://,必须是http://协议,否则code-server内部请求会失败
真正卡住的时候,别盯着进度条刷新——先看 Remote-SSH 日志(Remote-SSH: Show Log),里面每一步都打了时间戳和错误堆栈。最常被忽略的是服务器上 ~/.vscode-server 目录的属主突然变成 root,或者 SELinux 拦截了 code-server 绑定端口。这些细节不打日志,但会让整个流程静默失败。










