资讯动态

VSCode Remote-SSH 远程开发实战:从配置到避坑完整指南

发布时间:2026/9/19 9:42:34 来源:尧图企业网站定制
如果你平时需要频繁登录远程 Linux 服务器干活那你大概率经历过这种场景Xshell 连着服务器vim 里改代码改到怀疑人生改完了想跑一下又得把文件传上去传完发现环境不一样本地能跑服务器上就是报错。VSCode 的 Remote-SSH 插件就是专门治这个问题的它能让你的 VSCode 直接跑在远程服务器上本地窗口只是显示界面代码编辑、编译、调试全在远程完成。我最早接触 Remote-SSH 是在做深度学习项目的时候本地一台笔记本根本扛不住模型训练每天在终端和编辑器之间来回切效率低得离谱。后来换了这套方案等于把整个 VSCode 搬到了服务器上本地只需要一个能渲染界面的客户端远程服务器上跑着完整的 VS Code Server所有扩展、终端、调试器都跟着远程环境走。这篇文章我会把从零开始配置 Remote-SSH 的完整流程写清楚包含第一次连接、多台服务器管理、免密登录、端口转发、离线安装以及我实际踩过的各种坑希望能帮你少走弯路。1. Remote-SSH 到底解决什么问题1.1 传统远程开发方式的几个痛点在 Remote-SSH 普及之前大家远程开发基本就两条路要么用 Xshell、Putty 之类的终端工具连上去在 vim 里硬刚代码要么用 WinSCP 这类工具把文件下载到本地改完再传回去。先说终端 vim 路线。vim 本身并不差但对大多数写 Python、Java 或者前端的人来说它不是一个高效的选择。没有图形化补全、没有可视化调试、没有代码大纲你记住一堆快捷键也不见得能提升多少效率。更麻烦的是你改了代码之后想跑一下测试又得切到另一个终端窗口输出日志和排查错误全在纯文本环境里体验非常割裂。再说文件同步路线。把代码从服务器拉下来在本地 IDE 里改完再传回去这个过程频繁操作很容易出问题。最典型的就是两边文件不一致你刚在服务器上改了个配置本地不知道一覆盖就全丢了。如果团队里还有别人一起动同一个服务器这种“文件漂移”问题会让人崩溃。Remote-SSH 的思路完全不一样。它不是把文件拉到你本地也不是让你在终端里将就而是让服务器自己运行一个 VS Code Server你本地的 VSCode 只负责显示和交互。这样一来代码在服务器上、环境在服务器上、终端也在服务器上本地和远程之间不再存在“两份文件”的问题。1.2 Remote-SSH 的工作原理与结构Remote-SSH 的架构可以分为三块本地 VSCode 客户端、SSH 通道、远程 VS Code Server。当你通过 Remote-SSH 连接一台服务器时VSCode 会在远程机器上自动下载并启动一个 VS Code Server 进程。这个进程承担了大多数原本由本地 VSCode 完成的工作文件索引、语言服务、扩展执行、终端会话等等。本地客户端则通过 SSH 加密通道与远程 Server 通信把编辑界面、输入事件、渲染数据来回传递。这里有个关键点本地端只是“遥控器”真正干活的是服务器上的进程。所以你在本地打开一个超大项目内存占用不会像以前那样爆炸因为索引、搜索、补全这些重活都在服务器上跑。你本地笔记本只需要基本的网络和渲染能力就行哪怕是台配置一般的电脑连上高配服务器之后也能获得非常流畅的编辑体验。从网络角度来说Remote-SSH 只需要服务器开放 SSH 端口默认 22不需要额外开任何服务。相比 VNC、远程桌面这类方案它带宽占用小、响应快而且天然加密安全性也更有保障。1.3 这套方案适合谁我自己的使用场景集中在后端开发和深度学习中Remote-SSH 在这些场景下几乎可以替代 Xshell 和本地 IDE 的叠加组合。下面几类情况尤其适合 Remote-SSH深度学习与模型训练代码在服务器上跑在本地用 VSCode 直接编辑训练脚本、查看日志、用 Jupyter 做实验。后端服务开发本地写代码、远程启动服务、在同一个 VSCode 窗口里看日志、断点调试。数据分析与 Notebook远程服务器上装好 Python 环境和数据直接用 Jupyter 插件连上去跑。C/C 或嵌入式开发需要 Linux 环境编译的项目远程配置好工具链之后本地不需要再折腾交叉编译环境。学生或刚入门 Linux 的开发者只需要一台能跑 VSCode 的电脑就可以把服务器当作“远程电脑”来用学习成本远低于纯命令行工作流。它不适合的场景也有比如你只是偶尔想在服务器上改一个配置文件那直接用终端连上去也不麻烦没必要启动整套 VSCode。2. 环境准备与安装配置2.1 本地需要准备什么先说 VSCode 本身。到官网下载对应系统的安装包Windows、macOS、Linux 都有。Windows 上安装的时候我建议勾选“添加到 PATH”后面用命令行操作会方便很多。安装完打开进扩展商店搜索 “Remote - SSH”认准微软官方发布的那个作者是 Microsoft安装量通常排在第一位。这里容易搞混的是另一款插件叫 “Remote-SSH: Editing Configuration Files”这个是用来编辑 SSH 配置文件的辅助扩展不是连接远程服务器用的主插件。主插件就一个名字是 “Remote - SSH”。然后你需要确认本地有没有 SSH 客户端。Windows 10 1803 之后的系统都自带 OpenSSH 客户端可以在 PowerShell 或 CMD 里执行ssh -V检查。如果提示找不到命令去“设置 - 应用 - 可选功能 - 添加可选功能”里安装 OpenSSH 客户端即可。macOS 和 Linux 系统自带的 ssh 基本都能直接用。2.2 远端服务器需要确认什么服务器端的准备其实非常简单因为 Remote-SSH 依赖的就是系统自带的 SSH 服务。先确认服务器上 sshd 是否在运行。Ubuntu 和 Debian 系统可以执行sudo systemctl status ssh如果没装或者没启动安装一下sudo apt install openssh-server sudo systemctl enable --now sshCentOS / Rocky Linux 这类系统sudo systemctl status sshd sudo yum install openssh-server sudo systemctl enable --now sshd然后确认你能用普通终端工具连上服务器用户名、密码、端口都没问题。如果终端能连上Remote-SSH 也一定能连上这一点可以放心。需要注意一点Remote-SSH 要求服务器上有比较完整的运行时环境最简单的说法就是 glibc 版本不能太老。那些用了很多年的 CentOS 6或者内核极度精简的容器镜像可能会在启动 VS Code Server 的时候失败。这种情况要么升级系统要么用 VSCode 的 Remote-Tunnels 方案曲线救国。2.3 离线环境怎么装 Remote-SSH 插件很多开发机是内网环境不能直接访问外网VSCode 扩展市场自然也打不开。好在 VSCode 安装扩展支持离线方式VSIX 文件安装。先在一台能联网的电脑上打开 VSCode 扩展市场网页搜索 “Remote-SSH”找到对应版本后下载 .vsix 文件。注意一定要下载和你 VSCode 版本兼容的版本下载页面一般会标注。你也可以在联网电脑的 VSCode 扩展目录里找到已安装插件的 vsix 文件直接复制出来。把 .vsix 文件通过 U盘、scp 或者其他文件传输工具拷到离线机器上然后在离线机器上打开 VSCode打开命令面板CtrlShiftP输入并选择Extensions: Install from VSIX...选择刚才拷贝进来的 .vsix 文件等待安装完成重启 VSCode也可以直接使用命令行安装。进入 VSCode 安装目录或者在 PATH 已配置的情况下执行code --install-extension remote-ssh-0.107.1.vsix这里有个坑如果之前你已经装过旧版本的 Remote-SSH离线安装新版本前最好先把旧版卸载否则可能出现插件加载异常。卸载方式是在扩展面板里找到 Remote-SSH点管理图标选择“卸载”然后再从 VSIX 安装。3. 连接远程服务器的完整实操3.1 第一次连接远程主机插件装好之后就可以开始第一次连接了。以连接一台 IP 为192.168.1.100、用户名为ubuntu的服务器为例在 VSCode 中按CtrlShiftP打开命令面板输入Remote-SSH: Connect to Host回车在弹出的输入框里输入ubuntu192.168.1.100回车如果服务器 SSH 端口不是默认的 22要写成ubuntu192.168.1.100 -p 2222这种形式第一次连接会提示“选择平台”一般服务器选 Linux 即可输入密码回车连接成功后VSCode 左下角状态栏会显示一个类似 “SSH: 192.168.1.100” 的标志同时 VSCode 会进入“远程模式”。这个时候点击“打开文件夹”选择服务器上的项目目录就可以像编辑本地项目一样操作了。第一次连接时 VSCode 会在服务器上下载 VS Code Server这个步骤耗时取决于服务器网络一般几分钟内完成。有些服务器会因为网络问题卡在这一步处理方法我在下一章节详细说。连接之后你在 VSCode 里打开的终端默认就是远程服务器上的 shell可以直接执行python、pip这些命令用的是服务器上的环境和本地完全隔离。我在第一次用的时候犯过一个错误连接成功后直接在 VSCode 里打开本地文件夹结果编辑的还是本地文件。一定要记得远程模式下要打开远程文件夹可以在顶部菜单“文件 - 打开文件夹”旁边看到当前连接的服务器标识确认选中的是远程路径。3.2 用 SSH Config 管理多台服务器如果你只连一台服务器每次手动输入 IP 和用户名倒也无所谓。但实际工作中往往有开发机、测试机、GPU 服务器好几台每次都打一长串命令难免烦人。SSH Config 文件就是用来解决这个问题的。在 VSCode 命令面板里输入Remote-SSH: Open SSH Configuration File它默认会打开~/.ssh/configWindows 下是C:\Users\你的用户名\.ssh\config。这个文件允许你为每台服务器配置一个别名然后 VSCode 中就可以直接用别名连接。我的 config 文件大概是这样的Host gpu-01 HostName 192.168.1.101 User ubuntu Port 22 IdentityFile ~/.ssh/id_ed25519 Host dev-server HostName 10.0.0.5 User admin Port 2222配置完成保存后再打开Remote-SSH: Connect to Host你会发现列表里多了gpu-01和dev-server两个快捷选项直接回车就能连接不用再输入 IP 和用户名。配置项里比较常用的还有这些HostName真实的服务器 IP 或域名User登录用户名PortSSH 端口IdentityFile密钥文件的路径启用免密登录后使用LocalForward本地端口转发规则后面章节会讲ProxyJump跳板机配置如果服务器只能通过堡垒机访问可以指定跳板机关于 Host 别名的命名我建议用有意义的短单词比如按用途区分gpu-01、web-test别用aaa、server1这种连自己都分不清的名字。配置多了之后还可以用Include指令把不同项目的配置拆到独立文件里保持主配置文件干净。3.3 SSH 免密登录配置每次连接都输密码不是一个好体验尤其是经常重连的时候。更关键的是密码登录在某些安全要求高的环境里是不被允许的。配置 SSH 密钥免密登录一共就三步。第一步在本地生成密钥对。在本地终端执行ssh-keygen -t ed25519 -C your_comment一路回车即可。如果你对安全性有更高要求可以在提示输入 passphrase 的时候设置一个口令这样即使私钥泄露也无法直接使用。生成完成后本地~/.ssh/目录下会出现id_ed25519私钥和id_ed25519.pub公钥两个文件。第二步把公钥拷贝到服务器上。Linux 和 macOS 有现成命令ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu192.168.1.100执行后会要求输入一次密码之后服务器就会自动把公钥写入~/.ssh/authorized_keys。Windows 没有自带ssh-copy-id但我们可以用一条命令手动完成type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh ubuntu192.168.1.100 mkdir -p ~/.ssh cat ~/.ssh/authorized_keys第三步测试免密登录。直接执行ssh ubuntu192.168.1.100如果不需要输入密码就进去了配置成功。之后在 VSCode 里重新连接这台服务器也不会再提示输入密码。这里有一个必须要注意的权限问题。OpenSSH 对authorized_keys和.ssh目录权限非常敏感如果权限过宽服务器会拒绝使用公钥认证。一般需要保证chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys如果密钥文件权限不对VSCode 连接时会报Permissions 0644 for id_ed25519 are too open之类的错误在 Windows 上登录用户目录之外的密钥也容易出现这种问题最直接的解决办法是给文件设置只允许当前用户访问的权限。3.4 端口转发在本地访问远程服务远程开发中还有一个高频需求远程服务器上跑了一个 Jupyter Notebook、TensorBoard 或者调试用的 Web 服务你希望用本地的浏览器直接访问。Remote-SSH 提供了端口转发功能它会把远程服务器上的某个端口映射到本地。举个例子服务器上用 Jupyter 起了服务默认端口是 8888。连接远程后在 VSCode 中打开“端口”面板点“转发端口”输入 8888VSCode 会自动把远程 8888 端口映射到本地。然后你直接在本地浏览器访问http://localhost:8888就能看到 Jupyter 页面。如果想在每次连接时都自动转发不用手动点就在 SSH Config 里加上本地转发规则Host gpu-01 HostName 192.168.1.101 User ubuntu LocalForward 127.0.0.1:8888 127.0.0.1:8888 LocalForward 127.0.0.1:6006 127.0.0.1:6006上面配置的意思是本地 8888 端口转发到服务器的 8888 端口本地 6006 端口转发到服务器的 6006 端口。TensorBoard 默认端口就是 6006这样配置之后每次连上服务器本地的 TensorBoard 和 Jupyter 路径都是可用的。这里有一个小技巧如果远程服务只绑定在127.0.0.1那你本地就只能通过 SSH 转发访问服务器上其他用户即使知道端口也访问不到安全性更好。所以建议在服务器上启动 Jupyter 等服务时明确指定绑定地址为127.0.0.1而不是0.0.0.0。3.5 远程环境里的插件与 AI 编程工具连接远程之后你会注意到扩展面板的变化左下角多了一个“SSH: 主机名”的标识扩展列表也被分成了“本地”和“SSH”两类。很多刚用 Remote-SSH 的人会困惑为什么本地装了很多插件连接到远程服务器后全部失效了这是正常的。VSCode 的插件分为 UI 类插件和远程插件中文语言包、主题这类只影响编辑器界面的扩展在本地装一份就够了而 Python、C/C、Jupyter、GitLens 这类需要实际分析代码、运行调试工具的扩展必须安装在远程环境中因为它们需要访问远程服务器上的文件系统和解释器。在有远程连接的情况下扩展面板会显示一个“在 SSH: xxx 中安装”的按钮点它就会把插件装到远程服务器。你也可以在扩展列表里看到哪些插件已经在远程环境中安装哪些只在本地生效。实际操作中我一般先连接服务器然后直接搜索插件名称VSCode 会默认安装到当前远程环境中。比如在远程环境下安装 Python 插件装完之后通过Python: Select Interpreter选择服务器上的解释器路径调试和补全才会真正指向远程环境。现在很多 AI 编程工具也在往远程场景走。比如 OpenAI Codex CLI 这类工具如果你想在远程服务器上直接使用它来读取代码、生成补丁最常规的做法是在服务器上安装对应的 CLI 工具配置好 API Key 之后直接在 VSCode 内嵌终端里使用。VSCode 的终端本身就是远程服务器的 shell这些 CLI 工具的工作目录、读取的代码路径都是服务器上的文件不需要额外同步。如果你用的是 VSCode 插件形式的 AI 工具那就需要把插件装到远程环境有些工具对远程模式支持得很好有些则只能在本地模式工作买前先看插件的文档里有没有 Remote 支持说明。4. 常见问题与排查技巧实录4.1 一直卡在“Downloading VS Code Server”不动这是 Remote-SSH 用户遇到最多的一个坎我第一次用时也撞上了。点击连接之后VSCode 状态栏一直显示“Downloading VS Code Server”等十分钟也没反应最后提示超时。原因是远程服务器在尝试从微软服务器下载 VS Code Server 压缩包但服务器本身网络受限或者下载不稳定。手动解决思路是自己下载 VS Code Server 的压缩包直接放到服务器上的目标目录。具体操作分几步先查看你本地 VSCode 的版本和对应 Commit ID。在 VSCode 菜单栏“帮助 - 关于”里能看到一行类似Commit: e5a624b788d92b8d34d1392e4c4d9789406efe8f的信息复制这个 Commit ID。然后在一台能联网的电脑上下载对应版本的 server 包。下载地址的格式一般是https://update.code.visualstudio.com/commit:你的CommitID/server-linux-x64/stable把这个地址在浏览器里打开会下载一个 tar.gz 压缩包。把它传到服务器上然后解压到指定目录mkdir -p ~/.vscode-server/bin/你的CommitID tar -zxvf vscode-server-linux-x64.tar.gz -C ~/.vscode-server/bin/你的CommitID --strip-components1解压完成后重新在 VSCode 里连接服务器VSCode 会发现已有对应版本的 server 文件跳过下载步骤直接启动。注意这个目录名里的 CommitID 必须和本地一致否则 VSCode 不认。还有个替代方案是在服务器上直接执行下载命令前提是服务器能访问那个域名wget -O vscode-server.tar.gz https://update.code.visualstudio.com/commit:你的CommitID/server-linux-x64/stable如果服务器连 update.code.visualstudio.com 都访问不了还是踏踏实实用离线拷贝的方式吧。4.2 Windows 下 SSH Config 权限报错Windows 用户的典型噩梦是连接时报Bad owner or permissions on C:\Users\你的用户名\.ssh\config这个问题的根源是 Windows 上文件继承了父目录的访问权限OpenSSH 对权限非常苛刻任何多余的权限位都会拒绝执行。解决办法就是去掉继承权限只给当前用户完全控制权限。最快的处理方式是在 PowerShell 里执行icacls $env:USERPROFILE\.ssh\config /inheritance:r icacls $env:USERPROFILE\.ssh\config /grant:r $($env:USERNAME):F如果还报类似Permissions for id_ed25519 are too open同理可以对私钥文件执行icacls $env:USERPROFILE\.ssh\id_ed25519 /inheritance:r icacls $env:USERPROFILE\.ssh\id_ed25519 /grant:r $($env:USERNAME):F多数情况下报错信息里会直接写明是哪个文件权限不对照着处理就行。4.3 Host key 变更导致连不上还有一种比较常见的报错REMOTE HOST IDENTIFICATION HAS CHANGED!一般发生在服务器重装了系统、IP 被其他机器占用或者 OpenSSH 版本升级导致主机密钥变化时。SSH 客户端为了防御中间人攻击会把第一次连接时服务器返回的主机公钥记录在~/.ssh/known_hosts里下次连接发现公钥不一致就直接拒绝连接。如果你确定服务器是安全的可以清除旧记录ssh-keygen -R 192.168.1.100然后重新连接输入密码时会提示确认主机指纹确认一次即可。在 VSCode 里如果反复提示这个问题检查一下是不是你使用了跳板机导致每次连接经过的入口服务器公钥变化。另外企业内部经常有 IP 复用的情况如果之前连过同一 IP 的另一台机器也会出现这个报错。4.4 连接后找不到远程插件连接远程服务器后打开扩展面板发现装了一堆 Python、GitLens、Jupyter 的扩展但是代码补全、调试按钮全部无效。这个原因我在前面也说过插件没装到远程环境。判断方法很简单把鼠标悬停在某个扩展上看它的标注。如果显示“安装于 SSH: xxx”说明它在远程生效如果显示“在远程安装”说明它只在本地需要点一下远程安装。一个隐藏比较深的坑是即使你在远程环境里装了 Python 插件VSCode 内置的 Python 扩展有时候会沿用本地解释器路径导致代码补全用的还是本地的包。这时按CtrlShiftP输入Python: Select Interpreter手动选择服务器上的解释器比如/usr/bin/python3或 conda 环境路径。还有一个容易被忽略的点某些插件对 Remote-SSH 支持不完善比如一些需要图形界面的工具、无法通过 SSH 转发显示的窗口。如果插件在远程环境里一直报错可以去插件的 GitHub 仓库搜一下 Remote 相关的 issue通常能查到原因。4.5 连接频繁断开怎么处理远程连接不稳定是另一个高频问题。表现是 VSCode 用着用着状态栏提示“SSH 连接已断开”重连之后之前打开的终端和窗口都会丢失。原因基本可以归为两类网络本身不稳定或者 SSH 连接长时间空闲被服务端或中间的防火墙断开。解决思路是让客户端定期发送心跳包保持连接活跃。SSH 的ServerAliveInterval参数可以做到这一点。在~/.ssh/config中加一个默认配置Host * ServerAliveInterval 30 ServerAliveCountMax 3意思是每 30 秒向服务器发送一次心跳连续 3 次没有应答才判定连接断开也就是说能容忍最多 90 秒的网络波动。VSCode 本身的设置也可以配合调整。在用户设置里搜索remote.SSH把remote.SSH.remoteServerListenOnSocket设为 true有时候能解决端口冲突导致的断开问题。如果你用的是 Wi-Fi路由器的休眠策略也要检查下很多家庭路由会在空闲时断开长期 TCP 连接这是最容易被忽略的环节。如果连接确实不稳定建议在服务器上配合 tmux 使用。在 VSCode 终端里启动 tmux 跑任务即使 SSH 断开远程终端里的程序也还在继续跑重连后tmux attach即可恢复现场这是远程开发的一个保命技巧。5. 总结几个我自己的习惯最后分享几个我用 Remote-SSH 摸索出来的实用习惯。第一所有服务器的 SSH 配置都写在~/.ssh/config里用别名区分。每次连接只需要在命令面板里输入别名又快又不容易错。第二连接成功后的第一件事是更新系统确保 OpenSSH 和运行时环境是最新状态。很多远程环境启动 server 失败的问题更新完系统之后就好了。第三大项目打开前先在 VSCode 设置里确认一下搜索排除项把node_modules、.git、target这些目录排除掉远程索引速度会快很多。第四如果在远程环境里跑长时间任务优先使用 tmux别直接用 VSCode 的终端窗口挂任务。就算连接断开、VSCode 崩溃任务也丢不了。第五拿到一台新服务器我会先手动执行一遍 ssh 命令确认能连通再切换到 VSCode 里连。这样能快速区分问题出在服务器端还是 Remote-SSH 插件本身。Remote-SSH 这套方案让我彻底告别了本地环境和服务器环境之间来回折腾的日子现在写代码、调试、跑实验基本都在一个窗口里完成。配置好之后它带给你的效率提升是长期而且稳定的值得花点时间好好研究。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价