VS Code Remote SSH连接Windows服务器卡在下载?BITS断点续传实战
在进行远程开发时,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测试:
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域名的可达性:
::SecurityProtocol = ::Tls12
(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脚本保存到远程服务器并执行,即可绕过连接不稳问题。
# install-vscode-server.ps1
# 用法:修改 $commit 为你的VS Code commit ID,然后在远程服务器上执行
::SecurityProtocol = ::Tls12
$commit = "404102fc70f6f15e1aba226b6d56f4c75bd5fa4e" # ← 替换为你的 commit ID
$url = "https://vscode.download.prss.microsoft.com/dbazure/download/insider/$commit/vscode-server-win32-x64.zip"
# Stable 版本把 insider 改为 stable
$dir = "$env:USERPROFILE\.vscode-server-insiders\bin\$commit"
# Stable 版本用 .vscode-server 而非 .vscode-server-insiders
$zip = "$dir\vscode-server.zip"
New-Item -ItemType Directory -Force $dir | Out-Null
Remove-Item $zip -Force -ErrorAction SilentlyContinue
# BITS 下载,自动断点续传
Write-Host "Downloading via BITS..."
$job = Start-BitsTransfer -Source $url -Destination $zip -Asynchronous
$retries = 0
while ($job.JobState -ne 'Transferred' -and $retries -lt 3) {
if ($job.JobState -eq 'TransientError' -or $job.JobState -eq 'Error') {
Write-Host "Transfer interrupted, resuming... (attempt $($retries+1))"
Resume-BitsTransfer -BitsJob $job -Asynchronous
$retries++
}
$pct = if ($job.BytesTotal -gt 0) { ::Round($job.BytesTransferred/$job.BytesTotal*100,1) } else { 0 }
Write-Host " $pct% ($($job.BytesTransferred) / $($job.BytesTotal))"
Start-Sleep -Seconds 3
}
if ($job.JobState -eq 'Transferred') {
Complete-BitsTransfer -BitsJob $job
Write-Host "Download complete!"
} else {
Write-Host "BITS failed: $($job.JobState)"; exit 1
}
# 解压
Write-Host "Extracting..."
Expand-Archive -Path $zip -DestinationPath $dir -Force
Remove-Item $zip -Force
# 如果解压后多了一层目录,提升到上层
$sub = Get-ChildItem $dir -Directory | Select-Object -First 1
if ($sub) {
Get-ChildItem $sub.FullName | Move-Item -Destination $dir -Force
Remove-Item $sub.FullName -Recurse -Force
}
Write-Host "Installed! Verify:"
Get-ChildItem $dir | Select-Object Name
获取Commit ID
在本地VS Code中按Ctrl+Shift+P,输入“About”,在弹出窗口中找到“提交”后的40位哈希值。也可使用命令行:
code-insiders --version# 第二行即为commit ID
# 或者 code --version(Stable版)
执行方式
通过SSH从本地推送脚本并执行:
scp install-vscode-server.ps1 "远程主机:D:/Users/用户名/install-vscode-server.ps1"
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模板:
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下载是最可靠的替代方案。
Re: VS Code Remote SSH连接Windows服务器卡在下载?BITS断点续传实战
感谢楼主分享这么详细的实战经验!BITS断点续传的思路非常巧妙,比手动处理网络不稳定要省心很多。之前我也遇到过类似的内网解析问题,只想到了换镜像或者挂代理,没想到直接用Windows自带的BITS就能优雅解决。特别是你提到的prss域名可达而直接下载会断的问题,这个排查过程很扎实。 再请教一下,获取VS Code Insiders的commit ID,是不是在本地VS Code的“关于”页面或者Help里就能找到?另外,如果想把脚本封装成自动检测commit并触发下载的任务,有什么建议吗?
页:
[1]