VSCode需通过Remote-SSH插件远程连接虚拟机,而非本地启动;正确安装Microsoft官方Remote Development扩展包,配置~/.ssh/config(含HostName、User、IdentityFile),确保虚拟机SSH服务运行且22端口开放,并完成免密登录验证。

VSCode 无法直接在无桌面环境的虚拟机中“启动”——它不是靠双击图标运行的 GUI 应用,而是依赖远程连接或服务端模式。你真正需要的是让 VSCode 编辑器能稳定、低延迟、免密地访问虚拟机里的代码和工具链。
Remote-SSH 插件必须装对,且只装一次
别搜 Remote Development 或 Remote-SSH 分开装:VSCode 官方已将 Remote-SSH 作为 Remote Development 扩展包的子模块,安装主包即可自动带出。装错版本(比如第三方 fork 的 SSH 插件)会导致连接后无法加载终端、扩展全灰、vscode-server 下载失败。
- 正确操作:在 Extensions 商店搜索
Remote Development,认准 Publisher 是Microsoft,点击 Install - 验证是否生效:左侧活动栏出现远程图标(?),且按
Ctrl+Shift+P能搜到Remote-SSH: Connect to Host... - 常见错误:
Failed to download vscode-server—— 多半是插件没装全,或宿主机网络被代理/防火墙拦截了 GitHub release 域名
SSH 配置文件路径和格式不能手误
~/.ssh/config 是 Remote-SSH 唯一信任的配置入口,写错路径或语法会导致连接时反复弹密码框、Host 列表为空、甚至报 Could not resolve hostname。
- 必须用绝对路径写
IdentityFile,Windows 用户注意斜杠方向:IdentityFile "C:\Users\xxx\.ssh\id_rsa"(双反斜杠)或IdentityFile "C:/Users/xxx/.ssh/id_rsa" -
HostName必须是 IP(如192.168.37.129),不能填localhost或127.0.0.1(那是宿主机回环,不是虚拟机) - 别漏掉
User字段;若虚拟机是 root 登录,写User root,但 Ubuntu 默认禁用 root SSH,建议用普通用户
虚拟机必须跑通 SSH 服务,且端口可达
VSCode 远程连接本质就是走标准 SSH 协议,如果 ssh user@ip 在宿主机命令行都连不上,VSCode 一定失败。
- Ubuntu/CentOS 启动服务命令不同:
sudo systemctl enable --now ssh(Ubuntu) vssudo systemctl enable --now sshd(CentOS) - 检查端口是否监听:
ss -tlnp | grep :22,输出里要有sshd进程;若没有,说明服务根本没起来 - 防火墙必须放行 22 端口:
sudo ufw allow 22(Ubuntu)或sudo firewall-cmd --permanent --add-port=22/tcp && sudo firewall-cmd --reload(CentOS) - NAT 模式下宿主机 ping 不通虚拟机?必须改桥接,或手动在 VMware/VirtualBox 里配端口转发(NAT 设置 → 添加 22 端口映射到虚拟机 22)
免密登录不生效,大概率是公钥没进对地方
生成密钥只是第一步,关键要把公钥内容(id_rsa.pub 里的整段字符串)追加进虚拟机对应用户的 ~/.ssh/authorized_keys,且权限必须严格:
- 宿主机生成密钥:
ssh-keygen -t rsa -b 4096,一路回车,默认保存在~/.ssh/id_rsa - 复制公钥内容:
cat ~/.ssh/id_rsa.pub,全选复制(含ssh-rsa AAAA...开头那行) - 登录虚拟机后执行:
mkdir -p ~/.ssh && echo "paste-your-public-key-here" >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys - 验证免密:
ssh -i ~/.ssh/id_rsa user@ip,不输密码直接进 shell 才算成功
权限不对是最隐蔽的坑:authorized_keys 文件若属主不是当前用户、或权限大于 600,OpenSSH 会直接忽略它,还假装正常——你只能看到密码框反复弹出。


















