拓冰建站拓冰建站
首页 / 资讯中心 / 正文

VSCode Remote-SSH连接Ubuntu虚拟机:从网络配置到免密登录

如果你也是那种Windows主力干活Linux虚拟机专门用来跑环境的玩家这个需求你大概率遇到过Ubuntu装好了代码想放到Linux里跑但总不能一直在VMware那个小窗口里写吧。复制粘贴不好使、剪贴板不共享、虚拟机一卡写代码的心情全没了。VSCode远程连接Ubuntu就是解决这个问题的正经路子核心工具是SSH。这篇文章我把整个流程拆到最细从虚拟机网络配置、SSH服务开启、VSCode插件安装到首次连接、报错排查、免密登录和端口转发全部按小白照着做就能成的标准来写。我见过太多人卡在中间某一步就放弃了其实这列车的每一节车厢都有明确的检查点只要按顺序确认好一次跑通完全没问题。下面开始。1. 为什么要折腾远程连接虚拟机里写代码的三个痛点先说动机。很多人不理解虚拟机都打开了Ubuntu桌面也看到了直接在虚拟机窗口里写代码不就行了真不行。我用下来的感受是VMware窗口里写代码的体验大概处于能用但每天都在找罪受的水平。三个痛点最明显。第一界面体验断层。Windows下我习惯了多显示器、多标签页、快捷键切窗口而虚拟机窗口被限制在一个固定画布里分辨率还得手动调。更崩溃的是剪贴板经常不同步我在Windows复制一段代码切到虚拟机里粘贴发现是空的然后又得回头重新复制。这种零碎的摩擦一天下来消耗大量注意力。第二性能和资源的双重损失。Ubuntu桌面版本身就吃内存再叠加上VMware的图形加速机器差一点就会卡顿。很多时候你只是想跑一个Python脚本或编译一个C程序根本不需要看到桌面却被迫养着一个完整的GNOME图形环境。第三文件同步绕圈子。也有人用共享文件夹或者Samba在Windows和Linux之间互传代码但改完代码还得手动同步再加上编码格式、行尾符差异经常莫名其妙出bug。那为什么最终选 VSCode Remote-SSH因为它把编码体验和运行环境拆开了你仍然在VSCode这个本地编辑器里写代码但代码实际存放在Ubuntu上终端、解释器、编译工具、调试器全部跑在远程Linux环境里。下面是几种常见方案的对比。方案优点缺点适合场景VMware窗口直接开发零额外配置卡、剪贴板不同步、窗口管理差偶尔用一次Samba/共享文件夹文件在Windows侧文件同步靠手动容易冲突传文件VNC/远程桌面能看到完整桌面网络要求高、延迟明显必须用图形界面PuTTY XShell轻量稳定纯终端编辑体验弱运维服务器VSCode Remote-SSH本地编辑体验远程执行环境首次配置稍复杂日常开发主力结论很直接如果是正经写代码Remote-SSH是当前综合成本最低的方案。剩下的问题就是怎么把它跑通。2. 动手前把三件事理清楚网络、SSH服务、客户端很多人上来就装VSCode插件然后连不上再回来查问题。我的经验是先把底层链路理清楚最后再碰VSCode。这条链路从上到下依次是虚拟机网络、Ubuntu的SSH服务、Windows侧的SSH客户端和VSCode插件。每一层都有独立的验证方法。2.1 虚拟机网络怎么选NAT是默认最优解Ubuntu能上网不代表宿主机能直接连到它。这是新手最容易踩的第一个认知误区。虚拟机有三种常见网络模式我用VMware和VirtualBox都测过结论一致。NAT模式VMware里叫NATVirtualBox里叫NAT虚拟机通过宿主机共享IP上网对外表现为宿主机的一个内部设备。宿主机可以主动访问虚拟机虚拟机的出站网络也通。适合大多数开发场景。桥接模式Bridged虚拟机和宿主机在同一个局域网里有自己的独立IP看起来就像另一台实体机。适合需要被局域网其他人访问的场景。Host-Only模式虚拟机只能和宿主机通信不能上网。只适合做隔离实验。对小白来说默认选NAT就对了。理由很简单NAT不需要关心路由器配置不用担心同事的电脑IP占用虚拟机的IP由VMware内部DHCP分配宿主机访问它是稳定可控的。桥接模式虽然听起来更真实但一旦换了Wi-Fi或网线虚拟机的IP可能变反而麻烦。装好Ubuntu后在虚拟机里打开终端执行ip addr查看IP地址类似192.168.xxx.xxx这种。这里有个小坑很多人用ifconfig但新版本Ubuntu默认没装net-tools会提示command not found。直接ip addr就行这是现代Linux标准的网络查询命令。提示判断虚拟机网络是否正常的快速方法是ping www.baidu.com能通说明出站网络没问题。但别忘了出站正常和宿主机能连它是两码事。2.2 Ubuntu开启SSH服务Ubuntu默认只装了SSH客户端没有服务端。也就是说它能用ssh去连别人但别人连不上它。所以必须要装openssh-server。在Ubuntu终端里按顺序执行# 先更新软件源缓存 sudo apt update # 安装SSH服务端 sudo apt install -y openssh-server装完后用下面三条命令确认状态# 查看SSH服务状态 sudo systemctl status ssh # 开机自启 sudo systemctl enable ssh # 确认22端口在监听 ss -tlnp | grep 22如果最后一条命令能看到0.0.0.0:22或[::]:22的监听记录说明SSH服务已经正常起来了。再看一眼Ubuntu自带的防火墙sudo ufw status如果你之前手动开过UFW防火墙状态是active记得放行22端口sudo ufw allow ssh这一步很多人会忘但SSH连不上的错误里有一小半其实是防火墙在拦。2.3 宿主机安装VSCode和Remote-SSH插件VSCode安装没什么难点记住从官方网站下载。Windows下安装时有个选项叫添加到PATH建议勾上。安装完后搜索插件Remote - SSH这是微软官方出的扩展扩展ID是ms-vscode-remote.remote-ssh认准这个ID同名仿冒的插件很多。装好插件后VSCode左下角会出现一个绿色或蓝色的图标。这个图标是Remote开发的入口后面所有连接操作都从它出发。顺便提一句如果你之前按网上的教程装了一堆其他远程插件比如Remote - SSH: Editing Configuration Files这类它们是Remote-SSH的辅助扩展不用单独装主插件会自动带上。到这里底层三件事全部就绪。检查清单是虚拟机网络通不通、SSH端口在不在监听、VSCode插件装没装好。三件事都确认后再进入真正的连接环节。3. 从配置到第一次连接成功每一步都有产出配置过程其实就两件事写SSH配置文件然后发起连接。但这两件事里的细节决定成败。3.1 一份不会出错的SSH Config在VSCode里按F1或CtrlShiftP打开命令面板输入并执行Remote-SSH: Open SSH Configuration File...这时会让你选择配置文件Windows下默认路径是C:\Users\你的用户名\.ssh\config。如果弹出提示说文件不存在选择创建新文件然后把它保存到这个路径。把下面这段配置写进去Host ubuntu-vm HostName 192.168.xxx.xxx User yourname Port 22解释一下每个字段Host给这个连接起的别名随便写方便自己认就行。后面连接时选这个名字。HostNameUbuntu的IP地址就是刚才用ip addr查到的那个。User你登录Ubuntu时用的用户名不是邮箱也不是显示名是类似于yourname的那个短名称。可以通过执行whoami查询。PortSSH端口默认就是22写不写都可以但写上更清晰。注意Windows下如果你之前没建过.ssh文件夹直接创建C:\Users\你的用户名\.ssh\config即可。但如果你用的是老版本Windows或公司电脑有安全策略限制建议把路径放在VSCode提示的默认位置不要随意改到其他盘。3.2 发起首次连接遇到fingerprint怎么选配置写好后再按F1执行Remote-SSH: Connect to Host...选择刚才配置的别名ubuntu-vm。VSCode会新开一个窗口然后开始连接流程。首次连接时界面会弹出一个对话框内容是The authenticity of host 192.168.xxx.xxx cant be established. Are you sure you want to continue connecting?这是SSH在问你这台主机的指纹fingerprint不认识是否信任它并继续连接输入yes回车即可。原理很简单——SSH防止中间人攻击首次连接时记录主机指纹以后再连会校验。如果你不确定可以先把Ubuntu上执行ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub得到的指纹拿出来对照一下确认一致再输yes。接下来会提示输入密码。这里输入的密码是没有回显的屏幕上不会显示任何字符这是正常的不要以为键盘坏了。输完回车VSCode会在线安装vscode-server到远程Ubuntu这个过程视网络情况需要几十秒到几分钟。连接成功的标志是左下角显示SSH: ubuntu-vm同时底部状态栏变成绿色。3.3 验证连接不是表面成功这一步很多人省略但我觉得必须做因为VSCode不报错和确实能在远程干活是两回事。连接后先做三件事打开远程文件夹File-Open Folder此时弹出的文件浏览器会让你输密码然后看到的是远程Linux的文件系统。随便打开一个文件夹比如/home/你的用户名。打开集成终端快捷键Ctrl执行whoami和uname -a。如果输出的是Ubuntu的用户名和Linux内核信息说明终端确实跑在远程机器上。安装一个远程扩展比如Python。打开扩展面板搜索Python点击Install in SSH: ubuntu-vm。装好后在扩展列表里能看到这个插件被归到SSH: ubuntu-vm分类下而不是本地。这三步走完才算是真正跑通了远程开发链路。4. 一键复现排错现场连接失败的完整排查链这一节写给那些第一次没成的朋友。我把自己见过的所有失败案例按排查顺序整理成了一条链路从网络层一路往上到应用层。别跳着看按照这个顺序找问题在哪里一目了然。4.1 连接超时或卡在Setting up SSH Host如果在选择的瞬间就报Could not establish connection to ...或者长时间卡在转圈状态第一个要怀疑的是网络层不是VSCode。先到Windows的PowerShell或CMD里执行ping 192.168.xxx.xxx如果能ping通说明宿主机和虚拟机之间网络通着继续往下排查。如果ping不通问题在虚拟机网络。检查VMware菜单里的可移动设备或虚拟机设置确认网络连接是NAT模式且已连接。再回到Ubuntu里看一眼IP是否变了。如果ping能通但SSH连不上执行Test-NetConnection 192.168.xxx.xxx -Port 22Windows下这个命令可以快速判断22端口是否可达。一个很容易踩的坑虚拟机休眠或者VMware挂起后再恢复IP可能变了。每次连不上先重新ip addr确认一遍IP再把config里的HostName改掉。为了从根上解决这个问题我后面会在进阶部分说固定IP的方法。4.2 Permission denied (publickey,password)用户名和密码验证这个报错说明网络和端口都通但SSH身份验证没过。先看报错里的细节Permission denied, please try again.通常是密码错了或者用户名写错了。Permission denied (publickey,password).SSH服务器拒绝了基于密码的登录只允许密钥登录。查三处确认config里的User字段。注意不是root就能无障碍登录很多Ubuntu默认禁止root远程登录要用普通用户名。确认密码是否正确。Ubuntu安装时设置的用户密码不是某些工具里显示的动态密码。检查远程的sshd配置。执行sudo grep -E PasswordAuthentication|PermitRootLogin /etc/ssh/sshd_config正常应该看到PasswordAuthentication yes。如果看到的是no或这一行被注释掉了就用sudo nano /etc/ssh/sshd_config打开取消注释并改成yes然后执行sudo systemctl restart ssh重启服务。4.3 连接后立刻退出或反复要求密码这种症状是密码输对了连接建立起来了但两秒后自动断开或者要求重新输密码。这类问题九成出在远程家目录的权限上。SSH服务端对权限非常敏感如果~/.ssh或~/.ssh/authorized_keys权限过于开放会被直接拒绝。执行下面两条命令修正chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys如果你压根没建过.ssh目录则先创建再设置权限mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys另一类常见原因是Windows侧的known_hosts里记录了同一个IP但不同的指纹。比如Ubuntu重装系统后SSH host key变了Windows还保留着旧记录连接就会直接报REMOTE HOST IDENTIFICATION HAS CHANGED。解决办法是找到C:\Users\你的用户名\.ssh\known_hosts删除对应IP的那一行重新连接。4.4 此扩展在此工作区中被禁用因为其被定义为在远程扩展主机中运行这个提示很搞心态我初次遇到的时候也懵了。它的本质是VS Code的扩展分两类一类是本地UI扩展比如主题、快捷键增强一类是需要在远程主机上运行的扩展比如Python语言服务、VS Code Server端插件。Remote-SSH会自动决定每个扩展应该装在哪一侧。当你看到被定义为在远程扩展主机中运行的禁用提示通常是因为你在本地安装了某个扩展但它的manifest里声明了extensionKind: [remote]导致VSCode自动把它标记为远程扩展而你又没有连接到远程于是被禁用。解决办法很简单连接远程成功后再安装这个扩展选择Install in SSH: ubuntu-vm。已装在本地但被禁用的在扩展面板里找到它点击齿轮选择设置为远程扩展或者干脆点禁用然后重新连接远程再启用。这个问答在官方issue里出现过很多次其实不是bug是设计的扩展归类机制理解了就不慌。4.5 其他高频报错速查表我整理了一个表覆盖了我试过Remote-SSH以来遇到的其他高频问题。报错或现象主要原因先试的解法Could not establish connection to xxx网络不通或host配置错误ping宿主机、验证config文件Port 22: Connection timed out防火墙或端口未监听检查ss -tlnp、ufw statusREMOTE HOST IDENTIFICATION HAS CHANGEDknown_hosts记录旧的host key删除known_hosts中对应行vscode-server: 下载失败/超时远程~/.vscode-server损坏或网络问题删除~/.vscode-server后重新连接远程终端中文乱码远程locale未设置执行export LANGen_US.UTF-8并写入~/.bashrcBad owner or permissions on ~/.ssh/configWindows下config权限过大右键文件属性-安全-完全控制只留当前用户连接成功但打开目录失败远程目录权限不够使用有权限的用户或chmod排查问题的总体原则从链路底层往上查。网络层不通就别折腾SSHSSH服务没起来就别怪VSCodeVSCode能连上但扩展报错再去查扩展。按照这个顺序来绝大多数情况都能快速定位。5. 连上之后怎么把体验拉满免密、转发、开发习惯跑通是第一步真正好用的是把后续体验优化到位。这一节我选了三个投入产出比最高的优化点。5.1 SSH密钥免密登录省掉每次输密码每次连接都输密码次数多了就烦。SSH密钥登录是一次配置、永久受益的操作。原理很简单把本地生成的一把公钥放到远程主机的~/.ssh/authorized_keys里之后本地发起SSH请求时远程用公钥验证你的私钥密码环节就省了。在Windows的PowerShell或CMD里执行ssh-keygen -t ed25519 -C windows-local一路回车即可默认保存到C:\Users\你的用户名\.ssh\id_ed25519。然后执行type C:\Users\你的用户名\.ssh\id_ed25519.pub | ssh ubuntu-vm cat ~/.ssh/authorized_keys这条命令的意思是把本地的公钥内容追加到远程的授权列表中。执行完会要求输入一次密码之后就永久免密了。验证方式是直接执行ssh ubuntu-vm不再需要密码。提示免密登录后VSCode的Remote-SSH也会自动继承这个能力连接时不会再弹密码框体验接近本地开发。注意备份好私钥文件它就是你的登录凭证丢了没法通过远程找回。5.2 端口转发在Windows浏览器里打开虚拟机里的服务连接成功只是开始。你在Ubuntu里跑一个Web服务、Jupyter Notebook或者调试一个后端API总不能每次都去看虚拟机IP加端口吧。Remote-SSH内置了端口转发功能可以直接把远程端口搬到本地。最常见的场景Ubuntu里启动一个开发服务器端口是8000希望在Windows浏览器里直接访问http://localhost:8000。在已连接的VSCode窗口里找到端口面板Ports点击端口输入框填8000回车。VSCode会自动创建转发。接着在Windows浏览器打开http://localhost:8000就能访问到远程服务了。另一种更持久的方式是写进SSH Config里Host ubuntu-vm HostName 192.168.xxx.xxx User yourname Port 22 LocalForward 8000 localhost:8000这样每次连接都会自动把远程8000端口映射到本地8000端口。5.3 把虚拟机当成开发机的三条建议真正把Remote-SSH用起来之后会有种Windows是我的编辑器Ubuntu是我的编译器的感觉。给你三个我用下来觉得很值的配置建议。第一先拍快照再乱动。VMware支持虚拟机快照所有配置操作、系统更新之前先拍个快照出问题了秒回。这是远程开发最大的安全感来源。第二固定虚拟机IP。DHCP虽然省事但IP变了就得改config。最简单的方法是在路由器里给虚拟机MAC地址绑定固定IP或者在Ubuntu里手动配置Netplan。对纯内部开发我建议直接编辑/etc/netplan/下的yaml文件把dhcp4: no并配置静态IP改完sudo netplan apply生效。第三日常开发优先走Remote-SSH。很多情况下不需要打开VMware窗口VSCode远程连接后台虚拟机就能完成开发。VMware窗口可以最小化甚至让虚拟机后台运行节省宿主机资源。如果仅需要命令行也可以直接用ssh ubuntu-vm登录终端。最后再分享一个我自己的使用体会。远程连接受网络、SSH服务、密钥、VSCode四个层面的共同影响出问题时不要慌按照网络层 → 服务层 → 配置层 → 应用层这个顺序排查大部分问题十分钟内都能定位。很多人把它想复杂了其实链路并不长关键是每一步都要有验证意识。真到了连串行流程都跑通的那天你会发现敲代码的最佳姿势就是在Windows里开着VSCode而所有的运行和调试都在那台安静的Ubuntu虚拟机里完成。这个配置值得花半小时搞定因为之后每天写代码都在享受它。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门