VSCode远程连接SSH服务器:从原理到免密登录与排错完整指南 📅 发布时间:2026/9/20 10:40:57 👁 浏览次数: 去年年底有个同事跑来找我说家里电脑放着公司代码人在外面急得直转问我能不能远程把服务器上正在跑的脚本改一改。我告诉他装个 VSCode配好 SSH 远程连接人在哪都能写代码。他半信半疑试了一次第二天跟我说这东西我居然现在才知道。其实这类需求太常见了——数据在服务器上、算力在服务器上、代码仓库也在服务器上本地笔记本只负责当一个显示器和键盘。这篇教程就是围绕 VSCode 远程连接 SSH 服务器这条主线从底层原理讲到免密登录、多服务器配置、端口转发再讲到连不上时的完整排查思路。不管你是刚接触服务器的学生还是习惯天天 ssh 上去用 vim 改文件的运维新人这篇文章都值得从头到尾看一遍。1. 远程开发到底解决什么问题——以及它和远程桌面的根本区别1.1 你真正想要的不是把桌面搬过来而是像本地一样开发很多人一听说远程连接服务器第一反应是那不就是远程桌面吗还真不是。远程桌面的逻辑是把整个图形界面通过网络传给你你看到的是一整个虚拟机或者物理机的桌面带宽消耗大、延迟一高就卡得没法用。而 VSCode SSH 的逻辑完全不同代码在服务器上跑编辑器窗口却在你本地网络上传输的只是编辑操作、文件差异和终端输出量级比画面传输小得多。打个比方远程桌面像把整个办公室的视频直播给你你只能看交互还迟钝VSCode 远程连接则像是给你一张直达工位的钥匙卡你人不在办公室但你桌上的电脑屏幕和键盘随时听你使唤。网络稍微有点波动远程桌面早就花屏了VSCode 这边最多就是等你敲完一个回车体验差距非常明显。1.2 这几类人基本属于刚需学生和科研党实验室的 GPU 服务器、深度学习训练脚本都在远端本地笔记本根本跑不动大模型。VSCode 连上之后直接在远程写训练代码、看日志、边调参边看曲线比来回 scp 文件效率高出几个量级。后端开发与联调工程师服务部署在测试服务器上代码也在那里跑你本地没有环境。远程连上去改完就能重启服务看效果日志实时输出到终端定位问题快得多。运维和基础设施方向的人日常要改一堆服务器上的配置文件过去要么 ssh 上去 vim——说实话不少人用不惯 vim 的模态编辑要么用各种 SSH 工具界面老气还不好传文件。VSCode 远程连接可以直接用图形化编辑器改文件保存即生效。算法工程师数据预处理、训练脚本、模型仓库全在服务器远程连接后本地不用装一堆 Python 包能省掉大量本地能跑服务器跑不了的环境问题。另外提一句常见对比PyCharm 专业版也有远程解释器和远程部署功能但需要付费授权VSCode Remote-SSH 插件是全免费的方案对于绝大多数远程开发场景功能完全够用。这也是为什么我身边越来越多同事从 PyCharm 转到了 VSCode 这一套。2. 先搞懂 SSH 连接的底层逻辑后面排错能少走一半弯路2.1 一条 SSH 连接里发生的三件事SSHSecure Shell翻译过来是安全外壳它是今天连接 Linux 服务器最底层的协议。一次 SSH 连接建立过程中核心要解决三件事身份认证证明你是你。服务器要知道此刻连接过来的这个人是不是有权限登录的用户。传输加密认证通过之后所有后续数据都走加密通道别人在网络上抓包也看不懂内容。命令通道加密通道建好之后客户端和服务端之间才能执行远程命令、传输文件。VSCode 的 Remote-SSH 插件做的事就是在你本地 VSCode 和远程服务器之间建立这样一条 SSH 通道然后利用这条通道做两件事在远程服务器上安装一个轻量的服务端组件也叫 vscode-server再把本地编辑器的界面和远程文件系统连接起来。这个过程对用户几乎是透明的你感觉不到我在远程——打开文件、保存、跑终端命令跟操作本地文件夹一模一样。2.2 密码登录和密钥登录哪种更该用SSH 常见的登录方式有两种它们的区别值得先理解清楚因为后面配置免密登录时你得知道自己到底在配什么。对比项密码登录密钥登录认证材料账号密码一对密钥公钥 私钥每次连接是否要输入要不用自动完成安全性密码可能被爆破私钥不离开本地安全性更高适合场景临时连接、公网服务器第一次登录日常开发、需要长期稳定连接密码登录最大的问题不是密码本身弱而是容易被暴力破解。你的 22 端口一旦暴露在公网上几乎每小时都会收到一堆来自各地 IP 的扫描尝试。密钥登录则完全不一样服务器上只存公钥私钥只存在于你本地机器。别人即使把服务器上的公钥文件偷走也倒推不出私钥内容更没法登录。2.3 一组权限常识公钥为什么不怕被看到我第一次给服务器配密钥时也担心过公钥放在服务器上会不会被别人拿去登录后来才明白公钥本身就是用来公开的它的作用相当于一把锁——锁挂在门外谁都能看见但只有持对应私钥的人才能打开。整个密钥验证流程大概是这样的客户端发起连接声称自己有对应私钥。服务器用公钥生成一个随机挑战一串随机数据发给客户端。客户端用私钥对挑战数据做签名把签名结果传回去。服务器用公钥验证签名验证通过则允许登录。所以你可以理解成公钥是验证身份的标准私钥是证明身份的唯一凭证。私钥一旦泄露等同于把家门钥匙给了别人。保管私钥的第一原则就是永远不要把它上传到服务器永远不要发送给任何人。这里还有一组权限细节是后面排查密钥登录失败时最常踩的坑。服务器上~/.ssh目录权限必须是 700即只有当前用户可读写执行~/.ssh/authorized_keys文件权限必须是 600只有属主可读写~家目录也不能允许其他人写入。权限太开放OpenSSH 会直接忽略这个文件里的密钥表现出来的现象就是拿着正确的私钥也登录失败。我在很多生产服务器上排查过类似问题十次里有七次都是权限问题。3. 完整实操从装好 VSCode 到第一次连上服务器3.1 本地环境准备VSCode 与 Remote-SSH 插件第一步去官网下载 VSCode按自己操作系统选安装包Windows、macOS、Linux 都有。这里有一个小建议尽量去官网下载不要贪图方便用第三方整合版或绿色版一是版本更新无法保证二是有些渠道的安装包带了不少额外东西没必要冒险。安装完成后打开 VSCode点击左侧扩展图标搜索Remote - SSH认准发布者为 Microsoft 的那个点击安装。这个插件还有一个配套的Remote - SSH: Editing Configuration Files主要用于后面编辑 SSH 配置文件建议一并装好。检查是否安装成功按F1或者CtrlShiftP打开命令面板输入Remote-SSH如果能看到Remote-SSH: Connect to Host选项说明插件已经就绪。这一步如果命令面板里找不到大概率是插件没装上或者没装完重启 VSCode 再试一次。顺便提一个中文设置的事有些朋友刚装完 VSCode 是英文界面不习惯可以去扩展市场搜Chinese (Simplified) Language Pack装完重启就是中文界面。虽然不影响功能但对我这种英文阅读速度一般的人来说界面中文确实能减少误操作。3.2 远程服务器端确认sshd 是否在监听本地准备好了接下来要确认服务器端允许 SSH 连接。绝大多数云服务器在创建时都会预装 OpenSSH 服务端但有些精简系统或者自建虚拟机可能没有。在服务器上执行systemctl status sshd如果返回 active (running)说明服务正常。如果提示 Unit sshd.service could not be found说明服务端没装用下面命令安装# Ubuntu / Debian 系 sudo apt update sudo apt install openssh-server # CentOS / RHEL 系 sudo yum install openssh-server sudo systemctl enable --now sshd还要确认 22 端口没有被防火墙拦住。Ubuntu 上默认的防火墙是 ufw执行sudo ufw status如果防火墙是 active 状态需要放行 22 端口sudo ufw allow 22/tcp如果你买的是云服务器除了系统内的防火墙还要去云控制台检查安全组规则确认入方向放行了 TCP 22 端口。这步非常关键——我见过不少例子明明 sshd 正常、防火墙也没拦客户端还是连接超时最后发现是安全组根本没放行 22 端口。3.3 第一次连接密码方式的最短路径确认服务器端没有问题后回到本地 VSCode按F1打开命令面板输入并选择Remote-SSH: Connect to Host接下来有两种输入方式直接输入用户名服务器IP比如ubuntu1.2.3.4回车。或者先选Configure SSH Hosts配置一个主机别名但第一次连接建议直接输 IP少一步配置尽快看到一个结果。输入密码后VSCode 下方会出现一个状态提示比如 Setting up SSH Host 或者 Downloading VS Code Server。这一步是 VSCode 在远程服务器上安装它的服务端组件按当前网络条件可能需要几十秒到几分钟属正常现象。期间如果弹出选择远程系统类型选 Linux 即可。窗口左下角出现SSH: 1.2.3.4的字样同时打开了一个新窗口说明连接成功。之后你在这个窗口里打开文件夹进入的就是服务器的文件系统按 Ctrl 打开终端实际进入的就是远程服务器的 shell。3.4 升级为密钥登录一条走通免密的路密码登录虽然简单但每次连接都要输密码且长期暴露在公网上有被爆破的风险所以我的建议是第一次能用密码登录之后马上做密钥登录以后彻底免密。先在本地生成密钥对ssh-keygen -t ed25519 -C your_emailexample.com这里-t ed25519指定算法类型。相比传统 RSA 4096Ed25519 密钥更短、生成更快、安全性不低于 RSA是目前推荐方案。执行后一路回车就行密钥会保存在~/.ssh/目录下默认文件名id_ed25519私钥和id_ed25519.pub公钥。生成的公钥要部署到服务器上。Linux/macOS 下一行命令搞定ssh-copy-id -i ~/.ssh/id_ed25519.pub user1.2.3.4这条命令会要求输入一次服务器密码然后自动把公钥追加到服务器上~/.ssh/authorized_keys文件里。Windows 没有自带 ssh-copy-id在 PowerShell 里用管道方式实现type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user1.2.3.4 cat ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys如果是手动方式就把id_ed25519.pub的内容复制粘贴到服务器~/.ssh/authorized_keys文件末尾顺便执行chmod 600 ~/.ssh/authorized_keys和chmod 700 ~/.ssh。验证是否成功直接执行ssh user1.2.3.4如果不再要密码就说明配置成功。此时再回到 VSCode重新连接该主机整个过程就不再需要输密码了。有一点要提醒如果你本地配了多个密钥对比如一个用来连 Git 平台一个用来连服务器生成时用-f指定了不同文件名那么连接服务器时要用-i指定私钥路径或者把它写进后面的 SSH config否则 SSH 默认只会尝试~/.ssh/id_ed25519和id_rsa这些默认名字的密钥。4. 多台服务器怎么管理把连接信息写进 SSH config4.1 为什么要把连接信息写进 config 而不是每次手输当你只有一台服务器时每次输入用户IP也就几秒钟的事。但当服务器多起来——比如你手上有一个生产环境、一个测试环境还可能有一台跳板机——每次手输地址、端口、指定密钥就变得很烦而且容易搞混。SSH 的配置文件就是解决这个问题的把每台服务器的连接参数固化下来之后只需敲一个别名。配置文件位置WindowsC:\Users\你的用户名\.ssh\configLinux / macOS~/.ssh/config在 VSCode 里编辑这个文件最方便的方法是F1打开命令面板输入「Remote-SSH: Open SSH Configuration File」直接选默认路径即可。4.2 一份可以直接抄的 config 示例含跳板机SSH config 的语法非常直白每个连接块以Host开头下面缩进写参数。下面这份是我自己常用的模板Host myserver HostName 192.168.1.100 User ubuntu Port 22 IdentityFile ~/.ssh/id_ed25519 ServerAliveInterval 60 ServerAliveCountMax 3各参数含义参数作用Host连接别名ssh myserver就能连接HostName真实 IP 或域名User登录用户名PortSSH 端口默认 22IdentityFile指定使用的私钥文件ServerAliveInterval每隔多少秒发一次心跳防止连接空闲被断开ServerAliveCountMax连续收不到响应多少次就断开配合心跳使用其中ServerAliveInterval 60是我强烈建议加的。不少人在服务器上跑一个长时间任务泡杯咖啡回来发现终端卡死再一看连接早断了。有了心跳自动维持长连接稳定性会好很多。如果你的服务器不在公网而是通过一台跳板机才能访问利用 ProxyJump 参数可以一键穿透。示例Host jump HostName 1.2.3.4 User alice IdentityFile ~/.ssh/jump_key Host backend HostName 10.0.0.5 User bob ProxyJump jump这样本地执行ssh backendSSH 会自动先连 jump再通过它连到内网 backend 主机中间的转发细节完全不用你操心。VSCode 的 Remote-SSH 也支持这种写法在命令面板里选择主机时直接选backend别名即可。配置好之后连接方式变成ssh myserverVSCode 里则是F1-Remote-SSH: Connect to Host- 选择myserver不再需要记 IP、账号、端口。我习惯把生产环境加一个容易区分的别名比如prod-api、test-web连接时一眼就能分辨是在哪台机器上避免因为搞错环境导致误操作。4.3 Windows 下 config 文件权限引发的连环踩坑Windows 用户在编辑完 config 文件后可能会在连接时遇到一个经典报错Bad owner or permissions on C:\Users\thinkpad\.ssh\config这个报错在热词里也反复出现说明踩的人非常多。原因在于OpenSSH for Windows 对配置文件权限要求非常严格它要求 config 文件只能被当前用户和系统管理员访问。而 Windows 文件系统默认的权限继承机制往往让文件带有 Users 组或者其他账户的可读权限于是 SSH 直接就拒绝使用这个文件。解决办法也很直接把 config 文件的权限收紧到只允许当前用户访问。右键config文件选择属性。切到安全选项卡点击高级。点击禁用继承选择将已继承的权限转换为此对象的显式权限。在权限列表中删除除当前用户之外的所有账户和组。点确定重新连接。修好后别忘了重启 VSCode 再试因为 Remote-SSH 会缓存一部分配置读取结果。这个问题我已经见人踩过三四次了第一次遇到时我自己也折腾了十几分钟才明白是 Windows 权限模型和 OpenSSH 的权限检查逻辑不对付。5. 连上之后才是重头戏远程终端、端口转发与插件管理5.1 远程终端把 Ctrl 变成服务器命令行连接成功后按Ctrl 打开终端默认进入的就是远程服务器的 shell你可以在里面跑任何命令比如python train.py、docker ps、tail -f /var/log/nginx/access.log。终端也支持多开CtrlShift5可以切分终端。工作区打开远程文件夹的方式同样简单F1 - 输入打开文件夹或者直接点资源管理器的打开文件夹弹出的路径选择器里选中的是服务器上的目录。有一点要特别提醒连接成功之后你在本地终端里跑命令跟远程终端里跑命令效果完全不同。VSCode 底部那个终端如果有SSH: 1.2.3.4之类的标签说明则说明当前终端是远程终端要是没有这个标识那它是本地终端跑的一直是你自己电脑的命令。平时操作时先确认终端归属别在本地跑了一堆命令最后发现全在自己的电脑上执行了。5.2 端口转发把服务器上的服务搬到本地浏览器远程开发中最爽的一环是端口转发。很多工作流里你在服务器上起了个 Jupyter、Flask 或一个前端开发服务器比如监听服务器的 8888 端口想直接在本地浏览器里打开localhost:8888调试。不用额外装任何工具VSCode 自带端口转发功能。操作路径VSCode 底部状态栏或者命令面板搜索端口: 聚焦端口视图打开端口面板点击转发端口输入服务器上的端口号8888回车。之后 VSCode 会在本地也开一个 8888 端口把流量通过 SSH 通道转发到服务器上的 8888 端口。浏览器访问http://localhost:8888就等价于访问服务器的 8888。命令行里也可以用一条 ssh 命令实现同样效果ssh -L 8888:localhost:8888 user1.2.3.4-L参数的含义是把本地 8888 端口映射到远程主机 localhost 的 8888 端口。实际使用时端口号可以随心换本地用 9999 转发服务器的 8888 也行只要你本机 9999 没被占用。这个功能在分布式训练看面板、Grafana 监控页面、API 调试时都非常实用。5.3 插件别再装错地方本地扩展与远程扩展VSCode 的扩展分为两类本地扩展和远程扩展。Remote-SSH 连接之后扩展面板左下角会显示当前是SSH: xxx环境已安装扩展列表会被分成两个区段本地 - 已安装和SSH: xxx - 已安装。语言类插件要装到远程。比如 Python 插件、C/C 插件、Jupyter 插件它们需要访问服务器上的解释器、编译器所以必须装在远程环境。界面美化类插件装本地即可比如主题、图标、代码格式化风格这种东西装本地就够。某些插件两边都要装具体看插件文档说明。有个很常见的困惑是本地装了 Python 插件连上远程后写代码还是不提示语法、不识别函数原因就是插件没有安装到远程环境。在扩展面板里找到 Python 插件点在 SSH: xxx 中安装问题就解决了。另外远程扩展会消耗远程服务器的资源别一口气装一堆按需安装最稳妥。顺带提一下和 WSL 相关的场景。如果你本地开发环境是 WSLVSCode 的 Remote-SSH 在 WSL 终端里同样可正常使用只要 WSL 里具备 ssh 客户端即可配置和传输逻辑和 Windows 原生一致。6. 连不上服务器按这套排查链路走十分钟内定位问题6.1 先给故障分类网络、服务、认证、配置连不上服务器是一个太笼统的现象。排错的第一步是分类把问题归到下面四个大类中的某一类效率会高很多。现象大概率方向连接超时Connection timed out网络不通、安全组/防火墙拦截连接被拒绝Connection refusedsshd 服务没启动、端口不对认证失败Permission denied密码错误、密钥不匹配、authorized_keys 权限不对连上后卡在下载 vscode-server远程下载服务端组件失败、磁盘空间不足6.2 用 ssh -vvv 把握手过程摊开看当你在 VSCode 里连接失败时不要只看一个笼统的报错而是先回到命令行用ssh -vvv把底层握手过程完整打出来ssh -vvv user1.2.3.4-vvv是调试模式输出的日志会详细显示每一步发生了什么。你会看到Connecting to ...、debug1: Authentications that can continue: publickey,password、debug1: Offering public key这类信息。这些日志是判断问题在哪一层的金钥匙。比如最后停在Offering public key之后又进入密码提示说明私钥未被服务器认可重点检查密钥匹配和权限如果连connection to ... closed都没看到就直接超时那大概率是网络层问题。6.3 高频报错逐个拆解Connection timed out连接超时先 ping 一下服务器 IP。能 ping 通说明主机在线超时多出于端口层面云控制台安全组没放行 22 端口、服务器 ufw 拦截、或者主机配置了 iptables 规则。ping 不通就要看 IP 本身是否正确、服务器是否在运行以及是不是有本机防火墙挡了出方向流量。Connection refused连接被拒绝这个一般说明目标主机收到了连接请求但 22 端口没有服务在监听。到服务器上执行sudo systemctl status sshd sudo ss -lntp | grep 22第一行看 sshd 是否运行第二行看 22 端口是否监听。如果没监听启动 sshd 再说。还要注意有些修改了 sshd_config 之后忘记重启服务也会出现莫名其妙的连接异常改完配置记得sudo systemctl restart sshd。Permission denied, please try again认证失败如果用的密码登录先确认密码正确、账号正确注意区分大小写。多次输入错误密码后服务端可能会因 MaxAuthTries 限制暂时拒绝登录等一会儿再试。如果用的是密钥登录依次检查本地私钥路径是否写对。服务器~/.ssh/authorized_keys里有没有你的公钥内容。服务器端目录权限是否合规~不能对组和其他用户开放写权限~/.ssh为 700authorized_keys为 600。sshd_config 里是否设置PubkeyAuthentication yes。/etc/ssh/sshd_config里PasswordAuthentication no可能导致密码登录被禁反过来如果你只配了密码登录而服务器关闭了密码方式也会失败。Bad owner or permissions on config 文件这个上面单独讲过记住一个原则——.ssh 目录下的所有文件权限要收紧只允许当前用户读写。尤其是 Windows继承权限很容易带出多余的用户权限。Ubuntu SSH 无法连接这个词频繁出现在搜索里本质上是多个原因的综合。新版 Ubuntu 默认没有安装 openssh-server 的情况很常见另外就是 Netplan 或 NetworkManager 配置的网络一下子改了 IP导致之前记录的 IP 失效。先通过云控制台 VNC/救援模式登录服务器确认 sshd 状态和当前 IP再顺着上面的思路排查。6.4 一个可以复制到笔记里的检查顺序我每次帮人查连接问题时遵循的都是下面这套顺序基本能覆盖八成场景命令行先裸测ping IP-telnet IP 22或nc -vz IP 22。命令行再测 SSHssh -vvv userIP看日志停在哪个阶段。到服务器控制台确认 sshd 运行状态。确认密钥文件权限和 authorized_keys 内容。最后才看 VSCode 输出日志。为什么要在命令行先测一遍因为 VSCode Remote-SSH 的报错有时候是二次封装的把底层错误吞在插件日志里不如命令行输出直观。命令行能连上问题就在 VSCode 插件或其配置上命令行连不上问题在 SSH 层面跟 VSCode 毫无关系。这一步做完了问题范围直接砍掉一半。写在最后说实话这套配置我今天闭着眼睛都能搭完一遍但回想最开始折腾时最花时间的不是步骤本身而是搞不清楚原理、出了问题不知道往哪个方向查。所以我这篇文章特意把 SSH 的机制、权限要求、排错逻辑放在了和不亚于实操步骤同等重要的位置。以我个人经验给你三个建议第一别嫌命令行 ssh 测一遍麻烦这是最快确认问题层的路径第二所有服务器的连接信息集中写进 SSH config用别名管理长期收益非常明显第三密钥登录配好之后记得确认一下服务器端PasswordAuthentication是否要关掉公网服务器我建议改为no把爆破风险降到最低。如果你按这篇教程走完还是遇到没写到的报错可以先看 VSCode 输出面板里 Remote-SSH 的日志再对照 ssh -vvv 的输出基本都能定位。远程开发这个习惯一旦养成你会发现本地电脑性能不再是瓶颈换个新电脑也无需迁移一整套开发环境——因为真正干活的地方一直在服务器上。