
1. 先搞清楚 Failed to fetch 到底卡在哪一步Cursor 的 Remote SSH 不是把整个编辑器搬到服务器上跑它走的是「本地 UI 远端 Server」的分离架构。你在本地敲代码、点终端实际执行动作的是远端一个叫 VS Code Server 的轻量进程。这个进程第一次连接时才会被下载安装装好之后每次连接直接复用。报错Failed to fetch就发生在「下载安装」这个环节。现象很典型SSH 握手是成功的Cursor 能连上服务器日志停在Downloading VS Code Server或者Installing VS Code Server等几十秒后弹窗未能下载 VS Code 服务器(Failed to fetch)。重试几次结果一样因为下载源根本没通。为什么国内服务器容易踩这个坑下载地址指向update.code.visualstudio.com和 Cursor 自己的 CDN 域名部分云服务器默认没有公网出口或者 DNS 解析不到这些域名又或者服务器有出口但 Cursor 启动的远端进程读不到你 shell 里配的代理环境变量。这三类原因覆盖了绝大多数场景。这篇按「先定位、再修复」的顺序写给你能直接复制的配置骨架和清理命令。适合用 Cursor Remote SSH 连阿里云、腾讯云、自建机房服务器的开发者尤其是刚配好 SSH 就撞上这个报错的新手。2. 接入前的准备确认版本、拿好 Key、理清下载链路修复之前先把几个关键信息拿到手后面所有操作都依赖它们。第一是 Cursor 的 commit id。远端 Server 的版本必须和本地 Cursor 严格对应commit id 不一致会反复重装。在 Cursor 里点Help → About能看到 Commit IDmacOS 也可以用命令直接读cat /Applications/Cursor.app/Contents/Resources/app/product.json | grep -o commit: [^]*Windows 路径换成Cursor\resources\app\product.jsonLinux 在/usr/share/cursor/resources/app/product.json附近找。第二是远端目录结构。Cursor 的 Server 默认落在~/.cursor-server/bin/commit_id/VS Code 原版落在~/.vscode-server/bin/commit_id/。手动安装就是把解压后的文件放进这个目录再补一个标记文件让 Cursor 认为「已安装」。第三如果你在排查过程中需要验证模型行为、对比不同模型对同一段报错日志的分析可以用 TaoToken 的模型对话入口快速试一下地址是https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite对话页在 deep link 的模型对话路径。它在这里的作用是帮你快速判断「是网络问题还是配置问题」不是修复手段本身。如果你打算长期在多个服务器上用 Remote SSH建议顺手了解下 Coding Plan把常用模型的调用额度固定下来避免排查时反复切换账号。入口同样从官网进走 coding-plan 路径。3. 可复制配置settings.json、config.toml 与远端缓存清理这一节是核心按「先清缓存、再配代理、最后手动装」的顺序给骨架。3.1 远端缓存清理命令每次失败都会在远端留下半成品目录不清理的话重连会继续用坏缓存。SSH 上去执行# 停掉可能残留的 server 进程 pkill -f cursor-server || true pkill -f vscode-server || true # 清掉整个缓存目录会丢失远端插件重连后自动重装 rm -rf ~/.cursor-server rm -rf ~/.vscode-server # 确认磁盘和权限正常 df -h ~ ls -ld ~ls -ld ~这步别跳过。如果家目录属主不是当前用户或者权限是drwx------之外的奇怪值Server 解压会失败但报错信息被吞掉最后只显示Failed to fetch很容易误判成网络问题。3.2 远端代理环境变量如果服务器本身有出口但需要走代理光在.bashrc里 export 是不够的。Cursor Remote SSH 启动的是非登录 shell不加载.bashrc。要写进.bash_profile和.profile# ~/.bash_profile 和 ~/.profile 都加上 export HTTP_PROXYhttp://your-proxy-host:port export HTTPS_PROXYhttp://your-proxy-host:port export NO_PROXYlocalhost,127.0.0.1,::1改完source ~/.bash_profile然后env | grep -i proxy确认当前 shell 能看到。注意这里说的是服务器侧已有的网络出口配置具体怎么来的不在本文讨论范围。3.3 本地 settings.json 骨架Cursor 的 Remote SSH 配置在本地。打开Cmd/Ctrl Shift P输入Remote-SSH: Open SSH Configuration File选~/.ssh/config。一个可用的骨架Host my-remote HostName 203.0.113.10 User deploy Port 22 IdentityFile ~/.ssh/id_ed25519 ServerAliveInterval 30 ServerAliveCountMax 6ServerAliveInterval这两行是防长连接被中间设备掐断的下载大文件时尤其有用。3.4 手动安装 Server 的完整流程这是最稳的方案一次操作永久解决。本地下载对应 commit 的包COMMIT_ID替换成你的commit_id curl -L https://update.code.visualstudio.com/commit:${COMMIT_ID}/server-linux-x64/stable \ -o vscode-server-linux-x64.tar.gz上传并解压到远端scp vscode-server-linux-x64.tar.gz deploy203.0.113.10:~/ ssh deploy203.0.113.10 mkdir -p ~/.cursor-server/bin/${COMMIT_ID} tar -xzf ~/vscode-server-linux-x64.tar.gz \ -C ~/.cursor-server/bin/${COMMIT_ID} --strip-components1 chmod x ~/.cursor-server/bin/${COMMIT_ID}/server.sh chmod x ~/.cursor-server/bin/${COMMIT_ID}/bin/cursor-server chmod x ~/.cursor-server/bin/${COMMIT_ID}/node # 关键标记文件让 Cursor 跳过下载 touch ~/.cursor-server/bin/${COMMIT_ID}/0--strip-components1不能省否则会多套一层目录Cursor 找不到server.sh。标记文件0是空文件作用是告诉 Cursor「这个版本已就绪」。4. 验证请求从 DNS 到 Server 启动的分步检查配完别急着连按顺序验证哪一步断了就修哪一步。先测 DNS 和连通性nslookup update.code.visualstudio.com curl -I --max-time 10 https://update.code.visualstudio.com curl -I --max-time 10 https://cursor.shcurl -I返回HTTP/2 200或301/302都算通。如果卡住直到超时说明出口或 DNS 有问题回到 3.2 检查代理或者确认服务器有没有公网权限。再确认 Server 目录结构正确ls -l ~/.cursor-server/bin/${COMMIT_ID}/server.sh ls -l ~/.cursor-server/bin/${COMMIT_ID}/bin/cursor-server test -f ~/.cursor-server/bin/${COMMIT_ID}/0 echo marker ok三条都通过后本地 Cursor 里Remote-SSH: Connect to Host选my-remote。成功的话日志会显示Server found, skipping download然后直接进Starting server。这一步能过说明修复生效。如果还想验证远端进程真的起来了在服务器上ps aux | grep cursor-server | grep -v grep能看到 node 进程在跑就对了。5. 本篇常见错排查报错依旧 Failed to fetch但 curl 是通的。大概率是 commit id 不匹配。本地 Cursor 升级过远端装的是旧版本Cursor 会尝试重新下载。重新读一次本地 commit id重装对应版本。解压后 server.sh 权限不够。手动chmod x那三行漏了。远端 Server 启动依赖可执行位缺了会静默失败。代理配了但 Cursor 还是不走。检查是不是只写了.bashrc。Remote SSH 非登录 shell 不读它必须写.bash_profile和.profile。DNS 解析失败。临时改/etc/resolv.conf加nameserver 8.8.8.8能验证但重启会丢。要持久化得改网络管理配置具体方式看服务器发行版。磁盘满了。df -h ~看一眼。Server 包解压后几百 MB空间不足时解压中断报错同样指向下载失败。多台服务器重复踩坑。本地存一份对应 commit 的 tar 包新服务器直接 scp 上传解压比每次重新下载快得多。6. 后续怎么用更顺修好之后日常连接基本不会再碰这个问题除非 Cursor 大版本升级导致 commit id 变化。我的习惯是本地留一个~/cursor-server-cache/目录按 commit id 命名存 tar 包换服务器时直接传。如果你在排查过程中需要快速验证某段配置或报错日志的含义用模型对话入口问一下比翻文档快地址从官网https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite进走模型对话路径。长期在多个远端环境做开发的话Coding Plan 能把额度固定下来入口在官网 coding-plan 路径。API 相关的接入文档和 Key 管理在https://taotoken.net/api和 console、api-keys 路径下需要脚本化调用时从那里拿。最后提醒一句手动安装 Server 这个方案的本质是绕过下载环节所以它不依赖任何网络条件是最可靠的兜底。把 commit id 和 tar 包管理好这个报错基本就跟你无缘了。