远程开发报错Got bad result from install script?核心排查与手动安装vscode-server指南
我用远程插件连服务器写代码也不是一天两天了但每次换一台新机器、换一个新用户总会遇到点幺蛾子。其中最有名的报错之一就是那句经典的红底白字“Got bad result from install script”。你要是第一次碰上大概会先愣一下然后怀疑是不是服务器被我搞坏了。别问我是怎么知道的问就是踩过。这篇文章我尽量把这件事的来龙去脉讲透从错误是怎么产生的到怎么一步步排查再到我最推荐、最稳妥的手动安装方案最后再列几个实测过的常见问题和排查技巧。新手照着做也能搞定老手可以跳着看重点留意第3章的手动安装细节和第6章的经验表。1. 这个错误到底是怎么冒出来的1.1 Remote-SSH的运行机制先说清楚一件事VSCode远程连接服务器并不是我们平时用的那种RDP或VNC远程桌面它走的是一条完全不同的路。Remote-SSH插件的工作方式是在你本地VSCode界面里通过SSH协议在远程服务器上启动一个服务端程序也就是常说的vscode-server。这个服务端会负责处理文件读写、语言服务、终端执行这些脏活累活而本地VSCode只是把界面渲染给你看。所以整个连接流程可以概括成三步本地VSCode发起SSH连接。连接建立后本地端会检查远程服务器上是否已经存在对应版本的vscode-server。如果不存在就通过一段安装脚本自动下载、解压、启动。“Got bad result from install script”这个错误恰恰发生在第二步向第三步过渡的时候。也就是说SSH本身已经通了问题出在远程服务器上的那个安装脚本执行失败。它没能在服务器上把vscode-server装好于是本地端收到了这个带点调侃味道的报错提示。1.2 “Got bad result from install script”的触发链路我把这个错误的幕后链路拆开来看你就知道有多少环节可能翻车。本地VSCode在需要安装远程服务端时会向服务器发送一段脚本脚本的核心任务是下载一个server-linux-x64.tar.gz或者类似命名的压缩包然后解压到~/.vscode-server/bin/commit-id/目录下。这个下载地址指向的是VSCode的官方更新服务形如https://update.code.visualstudio.com/commit:commit-id/server-linux-x64/stable这一整条链条里任何一环不稳定都会导致脚本最终返回非零退出码最终在本地显示成“Got bad result from install script”。最常见的几类触发原因我归纳一下网络问题服务器访问不到更新服务地址或者下载被中断、超时。这是占比最高的一类。系统架构不匹配服务器是ARM架构但脚本却拿到了x86_64的包自然解压出来也没法启动。不过这种情况比较少见因为VSCode会尝试自动识别。服务器环境太老比如glibc版本过低、缺少某些基础依赖导致脚本里的检测命令执行失败。目录权限问题当前用户的主目录没有写权限或者.vscode-server目录已经被错误地以root身份创建普通用户写不进去。磁盘空间不足下载包几十MB解压后上百MB某些磁盘只有几百MB剩余的服务器很容易装到一半就挂掉。我之所以把机制讲这么细是因为很多人遇到这个报错就急着去删目录、重装插件却越搞越乱。真正有效的做法是先冷静判断这个错误大概率是下载环节失败还是运行环节失败。后面第3、第4章我会给出对应的判断手段。2. 动手排查前的三个基础检查2.1 确认远程服务器系统与VSCode版本先别急着上大动作排查第一步是搞清楚两件事服务器是什么系统什么架构以及本地VSCode当前是什么版本。这两件事直接决定后面的所有操作。远程服务器架构一般用这个命令看uname -m输出x86_64就对应server-linux-x64输出aarch64就对应server-linux-arm64如果是armv7l之类那对应的是server-linux-armhf。这里最容易出错的是把32位和64位搞混。有些老服务器装的是32位系统但VSCode已经基本放弃了对32位系统的支持这时候即使你手动了装好server后面也会遇到各种奇怪问题。本地VSCode版本怎么看在VSCode里按CtrlShiftP输入“About”回车或者直接看菜单“帮助”里的“关于”。记下版本号和Commit号比如我常用的某版本可能是1.85.2 (commit 8b3775030ed1a69b13e4f4c628517612c2d5ec1f)。这个Commit号很重要它是下载server时URL里的关键参数。2.2 检查网络连通性和下载地址很多人忽略的一点是真正执行下载的是远程服务器不是你本地电脑。所以就算你本地访问外网飞快服务器访问不了官方更新服务照样安装失败。在服务器上直接测一下比较靠谱curl -I https://update.code.visualstudio.com如果这条命令卡死或者报Could not resolve host那基本可以断定是服务器网络不在线或DNS有问题。如果返回一些HTTP响应头说明网络基本通畅。这里我还要补充一个经验有些服务器的curl和wget可能不是同一版本脚本里用到的下载工具也可能是系统里没有的。比如某些极简的容器镜像连tar都不全更别提curl。可以顺手检查一下这些基础命令which curl wget tar如果哪个缺失了用系统的包管理器装一下比如Ubuntu/Debian上就是apt install curl wget tar。很多时候修复一个看似复杂的问题其实只需要装一个基础依赖就是这么朴素。2.3 检查服务器时间与时钟同步这个坑比较隐蔽不遇到一次你根本想不到。当服务器的系统时间和实际时间偏差过大时VSCode下载server的过程中HTTPS证书校验会失败。脚本拿到的证书看起来是“过期”的于是下载失败最终报一个“Got bad result from install script”。检查方法很简单date再用date -u看看UTC时间是不是对得上。如果偏差很大就要考虑同步时间。常见的做法是安装ntpdate并执行一次手动同步或者在系统里配置好chrony或systemd-timesyncd。需要注意的是这个操作需要root权限。如果你只有普通用户权限可以先联系管理员处理或者用支持非特权同步的方案。时间问题如果没有及时处理哪怕手动装好server后续也会在连接时遇到TLS相关的报错所以我建议这一步一定要排在最前面。3. 核心解法手动安装VS Code Server3.1 获取正确的提交版本号如果基础检查都做完了网络也没问题那最省心且最不容易再次出错的做法就是手动把vscode-server部署到服务器上。手动安装的第一步是拿到你本地VSCode对应那个Commit号。前面提到可以在“关于”里看到但我经常直接看日志拿因为更不容易看错。具体操作在VSCode里按F1输入“Show Log”选择Remote-SSH的日志输出。日志里会有一行类似Creating new server...或者Looking for existing server at ...的信息。继续往下翻会看到一行带完整URL的日志比如[Info] Downloading https://update.code.visualstudio.com/commit:8b3775030ed1a69b13e4f4c628517612c2d5ec1f/server-linux-x64/stable如果日志没有明确写出URL也没关系本地VSCode版本加上它的Commit号是一一对应的。怎么看都不靠谱的话直接用本地版本号去VSCode的更新服务查也行不过日志里的信息往往已经够用。3.2 在服务器上留出足够空间拿到Commit号后先在服务器上确认主目录空间是否够用。vscode-server解压后大概有100MB到200MB取决于版本和平台。检查命令df -h ~如果空间确实紧张我的做法是优先清理不需要的缓存或者换一个有更大空间的目录来存放server。需要注意的是VSCode默认只在~/.vscode-server里找server如果你换到别的位置需要额外设置。不过一般主目录小到连200MB都放不下的场景比较少见真遇到的话清理一下旧版本包最有效。旧版本怎么清理假设你已经手动装过某版本可以直接删掉~/.vscode-server/bin下面的旧目录只保留当前要用的那个。3.3 本地下载然后上传到服务器最稳妥的方式是在你自己电脑上下载好压缩包再通过scp上传到服务器。这样本地网络条件好下载速度快还能顺便检查下载到的文件是不是完整的。先在你本地电脑上构造下载地址。假设你的Commit号是8b3775030ed1a69b13e4f4c628517612c2d5ec1f服务器是x86_64架构那么下载地址就是https://update.code.visualstudio.com/commit:8b3775030ed1a69b13e4f4c628517612c2d5ec1f/server-linux-x64/stable在本地浏览器里打开这个地址就会自动下载一个压缩包。为了避免文件名混淆建议把文件重命名成有意义的名字比如vscode-server-linux-x64.tar.gz。然后上传scp ./vscode-server-linux-x64.tar.gz usernameyour-server:/tmp/如果你之前配过别的主机名也可以用scp ./vscode-server-linux-x64.tar.gz myserver:/tmp/。上传完成后在服务器上先确认文件大小跟本地一致ls -l /tmp/vscode-server-linux-x64.tar.gz如果大小对不上多半是网络传输中断或者本地下载时就已经损坏需要重新来一遍。现在很多云服务器的带宽虽然够用但跨地域传输偶尔还是会掉包所以校验这一步别省略。3.4 在服务器上解压并放到正确位置接下来是重头戏。在服务器上创建一个目标目录目录名必须严格是本地的Commit号。我这里用示例commit号做演示mkdir -p ~/.vscode-server/bin/8b3775030ed1a69b13e4f4c628517612c2d5ec1f cd ~/.vscode-server/bin/8b3775030ed1a69b13e4f4c628517612c2d5ec1f tar -xzf /tmp/vscode-server-linux-x64.tar.gz --strip-components1这里有两个关键点。第一--strip-components1的作用是去掉压缩包内第一层目录结构因为解压出来通常是一个vscode-server-linux-x64的文件夹我们要的是把里面的内容直接放在commit目录下。如果没有这个参数VSCode会找不到可执行文件。第二目录名的commit号必须和本地VSCode完全一致。如果目录名不一致VSCode会认为server没装过又会重新触发安装脚本等于白忙一场。解压完成后检查一下关键文件是否存在ls -l ~/.vscode-server/bin/8b3775030ed1a69b13e4f4c628517612c2d5ec1f/server正常情况下会看到一个server可执行文件。此时还需要确认一下目录属主避免出现root创建、普通用户无法读写的情况。如果权限有问题直接改成当前用户所属chown -R $(whoami) ~/.vscode-server3.5 重新连接确认效果手动放置好server后回到本地VSCode重新尝试连接。有时VSCode会缓存一些连接状态建议顺手执行一下“Remote-SSH: Kill VS Code Server on Host”把远程可能残留的旧进程清掉再重连。如果一切正常状态栏会从“connecting”变为你远程服务器的名字控制台也能正常打开远程终端。如果你运气好这个过程会顺利得让你怀疑刚才那个报错是不是一场梦。4. 其他高频诱因与各自的处理方式4.1 磁盘空间不足导致的“半装半废”手动安装虽然能绕开下载环节但它并不能解决服务器本身磁盘空间不足的问题。系统里如果空间不够解压到一半就会失败也可能出现解压成功但后面启动时无法写入临时文件的奇怪现象。遇到这种情况我通常会先看一下df -h注意看根分区和主目录分区的使用率。如果根分区满了即使你的~目录在另一个分区某些临时文件路径比如/tmp也可能写入失败。清理方式有很多apt clean、yum clean all、删除旧内核、清理日志文件等。不过这些操作都需要谨慎不建议删掉不认识的系统文件。如果实在没空间换个思路把vscode-server放在别的分区然后通过软链接把它指回去也是一个可行的替代方案。4.2 权限问题别让root“污染”了主目录我遇到过很多次这样的情况用户为了图省事用root执行了某些安装命令之_after在普通用户下连接时发现.vscode-server目录的属主是root普通用户根本没有写权限脚本就“Got bad result”了。排查方式很简单ls -ld ~/.vscode-server ~/.vscode-server/bin如果owner不是你当前用户那就得调整属主。由于你本身不是root这种调整一般需要管理员执行。所以我经常提醒朋友们远程安装东西千万别一上来就用root跑安装脚本除非你确定当前用户权限已经存在严重问题。普通用户遇到了权限问题解法是让管理员把目录属主改回来而不是自己改名换姓去当root。4.3 防火墙、代理与网络访问限制服务器访问外网可能受到限制最常见的是公司内网服务器只能通过代理访问外部资源。VSCode的安装脚本默认会读取环境变量中的代理配置如果你在服务器上手动设置了HTTP_PROXY和HTTPS_PROXY脚本是可以继承的。别急着问为什么我不用代理也能访问——在受限环境里服务器能不能访问更新服务直接决定脚本成败。可以通过curl -I https://update.code.visualstudio.com测试如果失败但系统里确实有可用的代理服务那就在~/.bashrc里加上export HTTP_PROXYhttp://proxy-server:port export HTTPS_PROXYhttp://proxy-server:port然后source ~/.bashrc重新加载。这样做的好处是不仅解决了这个报错后续server内部需要下载扩展时也能用到。要小心的是代理配置如果写错反而会拖慢或阻断网络连接所以改完一定要重新用curl验证一次。4.4 glibc版本过低导致安装脚本失败VSCode Server新版对系统底层库有一定要求特别是glibc。如果服务器是比较老的CentOS 6或某类古董系统glibc版本很可能达不到要求。安装脚本执行时可能会在某个动态链接步骤报错最终但本地只会看到“Got bad result from install script”。检查glibc版本ldd --version输出里会显示类似glibc 2.17的版本。如果你的系统版本确实太老VSCode新版本就比较难支持。这时候我建议优先看看能不能升级系统基础库但这种操作风险极高不是生产环境可以随便做的。如果系统无法升级另一个可行的方向是选择旧一点的VSCode版本同时使用对应旧版本的server包。旧版本对应的commit号与安装版本也是一一对应的构建好URL后下载即可。这种办法适合确实需要兼容老系统的场景。5. 一个完整的故障复现与解决实录5.1 故障现场描述大概半年前我需要在一台云服务器上跑代码用的是CentOS 7配置比较基础内存2G磁盘20G。第一次用Remote-SSH连接时等了十几秒然后弹出了“Got bad result from install script”。我当时第一反应是网络问题因为我那台服务器带宽本来就小下载速度慢是常态。5.2 排查路径我做的事情和前面第2章写的顺序几乎一样先看uname -m确认是x86_64。再看date时间正常。df -h主目录剩余空间还有4G多空间够。用curl -I https://update.code.visualstudio.com测试发现响应极慢等了将近20秒才返回头部信息。这一步基本确定了问题方向服务器能访问外网上游但下载速度太慢导致安装脚本在下载过程中超时。VSCode的安装脚本并没有做很完善的断点续传和超时重试一旦下载中断就直接判定为安装失败。5.3 最终解决过程我没有继续让脚本反复尝试而是直接走了手动安装路线。具体过程和前面的步骤完全一致从本地浏览器下载对应的server包用scp传到服务器解压到指定commit目录。整个过程大约5分钟搞定。之后再连接一次就通了速度快得不像刚才那个报错过的机器。这里我额外做了一件事把那台服务器上正在运行的vscode-server进程重启了一次确保没有残留的坏进程干扰连接。重启方式在VSCode命令面板输入Remote-SSH: Kill VS Code Server on Host选中对应主机执行。然后重新连接。实测下来这招挺管用的很多手动装完之后依然连不上的场景其实是旧进程还在尝试原地失败。6. 常见问题与排查技巧速查6.1 常见报错与解决方案对照表我把平时常见的几个变种情况整理成一个表方便你按图索骥报错内容或现象最可能的原因优先处理办法Got bad result from install script 下载超时服务器访问更新服务过慢手动下载上传参考第3章EACCES: permission denied相关日志.vscode-server目录属主异常chown -R $(whoami) ~/.vscode-server下载链接404本地VSCode版本太旧或不支持该服务器升级VSCode到较新稳定版或换旧版本server解压后server文件无法运行架构不匹配或glibc版本过低检查uname -m和ldd --version连接成功后扩展无法正常安装远程server无法访问扩展市场检查服务器HTTP/HTTPS代理配置连接卡在Setting up SSH HostSSH本身或远程shell初始化问题用ssh -v独立登录查看详细日志这个表并不是万能的但覆盖了我这些年见到的绝大多数情况。遇到新报错时先别急着搜“vscode got bad result”然后复制粘贴网上的万能解决方案先找到真正影响安装脚本的那个环节往往是最快的路径。6.2 一些额外的经验技巧分享几个常规文档里很少会写到的细节。第一个技巧不要一上来就删~/.vscode-server。很多人遇到问题喜欢全删重来但如果你的.vscode-server里有大量扩展全删意味着后面重装扩展要再花不少时间。更安全的做法先只删除bin目录下的server本体尝试手动重装如果还不行再考虑连扩展目录一起处理。第二个技巧在服务器上你完全可以预先创建好server目录并安排一个空目录占位配合脚本逻辑减少“检查不存在时自动下载”的触发。做法是把server可执行文件放进去后顺手再创建一个install.lock之类的文件。不过这招依赖具体版本行为不算官方保障我自己用的不多知道有这回事就行。第三个技巧如果你的服务器是经常连接不同项目环境的跳板机可以考虑把~/.vscode-server整个目录打包放到对象存储里用脚本自动下载解压。多人团队用这种方式能大大减少每个人首次连机的等待和骚操作。类似场景我试过配合固定版本号使用效果最好。这已经属于进阶玩法了但文章既然写到这顺手提一嘴给感兴趣的人指个方向。写在最后我个人在实际操作中的体会是VSCode远程开发已经足够好用但它默认的自动安装链路在复杂网络环境下真的不够皮实。与其每次去重启插件、反复触发脚本不如学会手动安装vscode-server这个保底技能。这套技能学会了不仅能在“Got bad result from install script”出现时救急以后换一个新环境、调一台新机器也能更从容地处理远程连接问题。上面这些方法里手动安装被我推荐得最多因为它绕开了最容易出问题的下载环节而且把server的控制权握在了自己手里。以后再遇到类似问题你可以自信地打开终端一步步检查、下载、解压、连接而不是盯着那条红色报错发呆。说到底这类问题并不可怕可怕的是不知道它从哪里来、该往哪里修。希望看完这篇文章之后你也能对vscode-server的脾气了如指掌。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →