查看: 123|回复: 1

VS Code Remote SSH连接Windows服务器卡在下载?BITS断点续传实战

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
在进行远程开发时,VS Code Remote SSH扩展是连接Windows服务器的常用方式。然而,当远程服务器内网DNS无法解析微软CDN域名时,连接会永久卡在“正在下载VS Code服务器”阶段,最终超时失败。本文以Windows Server 2025环境为例,详细记录诊断过程,并给出基于BITS断点续传的实用解决方案。

环境与现象
本地系统为Windows 11,远程系统为Windows Server 2025 Datacenter(Build 26100),使用VS Code Insiders 1.110.0和Remote SSH扩展0.122.0,通过OpenSSH公钥认证连接。SSH登录本身正常(执行ssh 远程主机 "echo connected" 能正确输出),但启动Remote SSH后进度条始终停留在下载阶段,无法完成。

诊断过程:定位DNS解析问题
VS Code Server的下载流程大致为:update.code.visualstudio.com返回302重定向,指向vscode.download.prcdn.microsoft.com。在远程服务器上执行nslookup测试:
  1. nslookup vscode.download.prcdn.microsoft.com
复制代码
结果返回“Non-existent domain”,证明内网DNS(192.168.1.5)无法解析prcdn.microsoft.com域名,这是根本原因。

排查可用CDN
微软为VS Code提供了多个CDN域名,逐一测试其DNS解析情况:
vscode.download.prcdn.microsoft.com:失败(默认重定向目标)
az764295.vo.msecnd.net:成功(旧版CDN,本地也无法解析)
vscode.download.prss.microsoft.com:成功(解析到金山云CDN节点)
在远程服务器上用PowerShell验证prss域名的可达性:
  1. [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
  2. (Invoke-WebRequest -Uri 'https://vscode.download.prss.microsoft.com/dbazure/download/insider/404102fc70f6f15e1aba226b6d56f4c75bd5fa4e/vscode-server-win32-x64.zip' -Method Head -UseBasicParsing -TimeoutSec 10).StatusCode
复制代码
返回200,说明prss CDN可达。

发现连接不稳定问题
虽然prss CDN可解析,但使用WebClient.DownloadFile()直接下载时,大约在传输25MB(约39%)时连接中断,导致zip文件不完整,无法解压。多次尝试均在相同位置断开,判断是CDN边缘节点的连接保持问题。

排除镜像方案
批量测试了华为云、阿里云、腾讯云、npmmirror、中科大、山大等10余个国内镜像,所有镜像均没有同步Insiders版本,返回404或HTML错误页。镜像方案仅适用于Stable版,不能满足当前Insiders版本需求。

解决方案:BITS断点续传
Windows自带的BITS(后台智能传输服务)原生支持断点续传,连接中断后自动恢复。只需将以下PowerShell脚本保存到远程服务器并执行,即可绕过连接不稳问题。
  1. # install-vscode-server.ps1
  2. # 用法:修改 $commit 为你的VS Code commit ID,然后在远程服务器上执行
  3. [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
  4. $commit = "404102fc70f6f15e1aba226b6d56f4c75bd5fa4e" # ← 替换为你的 commit ID
  5. $url = "https://vscode.download.prss.microsoft.com/dbazure/download/insider/$commit/vscode-server-win32-x64.zip"
  6. # Stable 版本把 insider 改为 stable
  7. $dir = "$env:USERPROFILE\.vscode-server-insiders\bin\$commit"
  8. # Stable 版本用 .vscode-server 而非 .vscode-server-insiders
  9. $zip = "$dir\vscode-server.zip"
  10. New-Item -ItemType Directory -Force $dir | Out-Null
  11. Remove-Item $zip -Force -ErrorAction SilentlyContinue
  12. # BITS 下载,自动断点续传
  13. Write-Host "Downloading via BITS..."
  14. $job = Start-BitsTransfer -Source $url -Destination $zip -Asynchronous
  15. $retries = 0
  16. while ($job.JobState -ne 'Transferred' -and $retries -lt 3) {
  17. if ($job.JobState -eq 'TransientError' -or $job.JobState -eq 'Error') {
  18. Write-Host "Transfer interrupted, resuming... (attempt $($retries+1))"
  19. Resume-BitsTransfer -BitsJob $job -Asynchronous
  20. $retries++
  21. }
  22. $pct = if ($job.BytesTotal -gt 0) { [math]::Round($job.BytesTransferred/$job.BytesTotal*100,1) } else { 0 }
  23. Write-Host " $pct% ($($job.BytesTransferred) / $($job.BytesTotal))"
  24. Start-Sleep -Seconds 3
  25. }
  26. if ($job.JobState -eq 'Transferred') {
  27. Complete-BitsTransfer -BitsJob $job
  28. Write-Host "Download complete!"
  29. } else {
  30. Write-Host "BITS failed: $($job.JobState)"; exit 1
  31. }
  32. # 解压
  33. Write-Host "Extracting..."
  34. Expand-Archive -Path $zip -DestinationPath $dir -Force
  35. Remove-Item $zip -Force
  36. # 如果解压后多了一层目录,提升到上层
  37. $sub = Get-ChildItem $dir -Directory | Select-Object -First 1
  38. if ($sub) {
  39. Get-ChildItem $sub.FullName | Move-Item -Destination $dir -Force
  40. Remove-Item $sub.FullName -Recurse -Force
  41. }
  42. Write-Host "Installed! Verify:"
  43. Get-ChildItem $dir | Select-Object Name
复制代码

获取Commit ID
在本地VS Code中按Ctrl+Shift+P,输入“About”,在弹出窗口中找到“提交”后的40位哈希值。也可使用命令行:
  1. code-insiders --version  # 第二行即为commit ID
  2. # 或者 code --version(Stable版)
复制代码

执行方式
通过SSH从本地推送脚本并执行:
  1. scp install-vscode-server.ps1 "远程主机:D:/Users/用户名/install-vscode-server.ps1"
  2. ssh 远程主机 "powershell -ExecutionPolicy Bypass -File D:\Users\用户名\install-vscode-server.ps1"
复制代码

实际效果
运行脚本后,BITS自动进行断点续传,过程中曾遇到一次中断(78.3%时暂停,恢复后从91.9%继续),最终成功下载完整文件(约63943408字节),解压后即可使用。断开VS Code并重新连接,不再卡在下载阶段。

现有方案对比
网上大量文章针对Linux远程服务器,方案为手动wget下载+scp传输+tar解压。本文场景的不同之处:
远程OS:Windows Server(非Linux)
失败原因:有外网但prcdn DNS无法解析(而非完全无外网)
下载格式:.zip(非.tar.gz)
传输问题:CDN连接在约25MB后中断(非单纯无法连接)
解决手段:BITS断点续传(而非手动scp)
适用版本:Stable和Insiders均支持(镜像站不同步Insiders)

关键信息速查
VS Code Server下载URL模板:
  1. https://vscode.download.prss.microsoft.com/dbazure/download/{quality}/{commit}/vscode-server-{os}-{arch}.zip
复制代码
其中{quality}为stable或insider,{os}-{arch}为win32-x64、linux-x64、linux-arm64等。
安装目录:%USERPROFILE%\.vscode-server-insiders\bin\{commit}\(Insiders)或 %USERPROFILE%\.vscode-server\bin\{commit}\(Stable)。
VS Code Remote SSH扩展中,remote.SSH.useOSS和remote.SSH.ossDownloadUrl可覆盖Linux远程的下载源,但Windows远程的PowerShell下载脚本硬编码了update.code.visualstudio.com,无法通过设置修改,因此手动使用BITS下载是最可靠的替代方案。
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层

Re: VS Code Remote SSH连接Windows服务器卡在下载?BITS断点续传实战

感谢楼主分享这么详细的实战经验!BITS断点续传的思路非常巧妙,比手动处理网络不稳定要省心很多。之前我也遇到过类似的内网解析问题,只想到了换镜像或者挂代理,没想到直接用Windows自带的BITS就能优雅解决。特别是你提到的prss域名可达而直接下载会断的问题,这个排查过程很扎实。 再请教一下,获取VS Code Insiders的commit ID,是不是在本地VS Code的“关于”页面或者Help里就能找到?另外,如果想把脚本封装成自动检测commit并触发下载的任务,有什么建议吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-5 18:18 , Processed in 0.029691 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部