使用 SSH 进行远程开发

Visual Studio Code 远程 - SSH 扩展允许你在任何运行 SSH 服务器的远程机器、虚拟机或容器上打开远程文件夹,充分利用 VS Code 的功能集。一旦连接到服务器,你可以与远程文件系统中任何地方的文件和文件夹进行交互。

无需源代码存在于本地机器即可享受这些优势,因为扩展直接在远程机器上运行命令和其他扩展。该扩展会在远程作系统上安装 VS Code Server;服务器独立于远程作系统上任何现有的VS Code安装。

SSH 架构

这使得 VS Code 能够提供本地质量的开发体验——包括完整的 IntelliSense(补全)、代码导航和调试——无论你的代码托管在哪里

入门

注意:在复习完本主题后,你可以开始学习入门SSH教程

系统需求

本地:还必须安装一个支持的 OpenSSH 兼容 SSH 客户端

远程SSH主机:运行在以下服务器上的SSH服务器

  • x86_64 Debian 8+、Ubuntu 16.04+、CentOS / RHEL 7+。
  • ARMv7l(AArch32)树莓派作系统(以前称为Raspbian)Stretch/9+(32位)。
  • ARMv8l (AArch64) Ubuntu 18.04+(64位)。
  • Windows 10 / Server 2016/2019(1803+),使用官方 OpenSSH 服务器
  • macOS 10.14+(Mojave)SSH主机启用了远程登录
  • 远程主机需要1GB内存,但建议至少配备2GB内存和2核CPU。

其他格利比克基于x86_64的Linux发行版ARMv7l(AArch32)和ARMv8l(AArch64)如果具备必要的前提条件,应该可以使用。请参阅《Linux远程开发》文章,了解如何启动社区支持的发行版的前提和技巧。

虽然支持 ARMv7l(AArch32)和 ARMv8l(AArch64),但由于这些设备中使用了 x86 原生代码,这些设备上安装的某些扩展可能无法使用。

安装

要开始,你需要:

  1. 如果还没有兼容OpenSSH的SSH客户端,请安装。

  2. 安装Visual Studio CodeVisual Studio Code Insiders

  3. 安装Remote-SSH扩展。如果你计划在 VS Code 中使用其他远程扩展,可以选择安装远程开发扩展包

SSH主机设置

  1. 如果你还没有设置SSH主机,可以按照Linux、Windows 10 / Server (1803+)macOS SSH主机的说明作,或者在Azure上创建一个虚拟机。

  2. 可选:如果您的Linux或macOS的SSH主机会被多个用户同时访问,建议在VS Code用户设置中启用Remote.SSH:远程服务器监听套接字,以提升安全性。

    在设置编辑器中:

    监听套接字VS代码设置

    详情请参见“技巧与窍门”文章。

  3. 可选:虽然支持基于密码的认证,但我们建议为您的主机设置基于密钥的认证。详情请参见“技巧与窍门”文章。

连接到远程主机

首次连接远程主机时,请遵循以下步骤:

  1. 通过从终端或PowerShell窗口替换命令,验证你是否能连接到SSH主机user@hostname视情况而定。

    ssh user@hostname
    # Or for Windows when using a domain / AAD account
    ssh user@domain@hostname
    
  2. 在 VS Code 中,选择 Remote-SSH: Connect to Host......从命令面板(F1⇧⌘P(Windows,Linux Ctrl+Shift+P)中选择,并使用相同设置user@hostname也就是第一步。

    输入框user@host示意图

  3. 如果VS Code无法自动检测你连接的服务器类型,系统会要求你手动选择服务器类型。

    平台选择示意图

    一旦你选择了平台,它就会被存储在VS Code设置里,下面是偏远。SSH.remotePlatform所以你可以随时更改。

  4. 过一会儿,VS Code会连接到SSH服务器并自行设置。VS Code会通过进度通知让你随时了解情况,你还能在远程 - SSH输出通道。

    提示:连接挂断或失败?请参阅故障排除技巧,了解如何解决常见问题。

    如果你发现关于SSH文件权限的错误,请参见“修复SSH文件权限错误”部分。

  5. 连接后,你会进入一个空白窗口。你总可以查看状态栏,看看你连接的是哪位主机。

    SSH状态栏条项

    点击状态栏项目会显示连接时的远程命令列表。

  6. 然后你可以像本地一样,使用“打开文件”或“打开工作空间”文件>打开,打开远程机器上的任何文件夹或工作区>!

    在远程SSH主机上打开的文件

接着安装连接主机时想用的扩展,开始编辑吧!

注:在ARMv7l / ARMv8l格利比克SSH主机,部分扩展可能因扩展内部的x86编译原生代码而无法工作。

在一个容器中的远程SSH主机上打开一个文件夹

如果你使用的是Linux或macOS的SSH主机,你可以同时使用Remote - SSH和开发容器扩展,在容器内打开远程主机上的文件夹。你甚至不需要本地安装 Docker 客户端。

具体做法:

  1. 按照安装步骤在远程主机上安装Docker,并在本地安装VS Code和Dev Containers扩展。
  2. 可选:设置基于SSH密钥的服务器认证,这样你就不需要多次输入密码。
  3. 按照远程-SSH扩展的快速启动作,连接到主机并打开一个文件夹。
  4. 使用命令面板中的开发容器:在容器中重新打开命令(F1⇧⌘P(Windows,Linux Ctrl+Shift+P)。

其余的开发容器快速入门功能按现状应用。你可以在 Dev Containers 扩展的文档中了解更多。如果你不满足需求,也可以查看“在远程Docker主机上开发”的文章,了解其他选项。

断开与远程主机的连接

完成编辑远程主机文件后,选择“关闭远程连接”>文件以断开与主机的连接。默认配置中不包含该命令的快捷键。你也可以直接退出VS Code来关闭远程连接。

记住主机和高级设置

如果你有一组经常使用的主机,或者需要通过某些额外选项连接主机,你可以将它们添加到符合 SSH 配置文件格式的本地文件中。

为了方便设置,扩展名可以指导你添加主机,无需手动编辑这个文件。

首先,选择Remote-SSH:新增SSH主机......从命令面板中(F1⇧⌘P(Windows,Linux Ctrl+Shift+P)或在活动栏的SSH远程资源管理器中点击“添加新建”图标。

远程探索器 添加新项目

然后系统会要求你输入SSH连接信息。你可以输入主机名:

远程探索器SSH主机输入

或者说是完整的你用来从命令行连接到主机的命令:

远程探索器SSH命令输入

最后,你会被要求选择一个配置文件来使用。你也可以设置“远程。SSH.configFile”你的用户中的属性settings.json如果你想使用与列表中不同的配置文件,就用文件。延期会帮你解决剩下的事!

例如,进入SSH -I ~/.ssh/id_rsa-remote-ssh yourname@remotehost.yourcompany.com在输入框中会生成以下条目:

Host remotehost.yourcompany.com
    User yourname
    HostName another-host-fqdn-or-ip-goes-here
    IdentityFile ~/.ssh/id_rsa-remote-ssh

有关生成此处显示密钥的详细信息,请参见“技巧与窍门”。你可以用SSH配置文件格式支持的任何内容手动编辑这个文件,这只是一个例子。

从此以后,当你选择远程SSH:连接主机......时,主机会出现在命令面板(F1,Windows,Linux Ctrl+Shift+P远程资源管理器SSH目标部分。

远程探测器中的SSH目标

远程资源管理器允许你在远程主机上打开新的空窗口,或者直接打开之前打开的文件夹。展开主机,点击你想在主机上打开文件夹旁边的“打开文件夹”图标。

远程浏览器打开文件夹

管理扩展

VS Code 在两个地方运行扩展:本地在 UI/客户端运行,或远程运行在 SSH 主机上。影响VS Code界面的扩展,比如主题和片段,会本地安装,但大多数扩展会安装在SSH主机上。这确保了你的流畅体验,并允许你从本地机器在 SSH 主机上安装特定工作空间所需的扩展。这样,你就可以从上次停下的地方继续,换成带有扩展的另一台机器。

如果你从扩展视图安装扩展,它会自动安装到正确的位置。安装后,你可以根据分类分组判断扩展安装的位置。

会有一个类别用于你的远程SSH主机:

工作区扩展类别

还有一个本地安装类别:

局部扩展类别

注:如果您是扩展作者,发现扩展无法正常工作或安装在错误的位置,详情请参阅支持远程开发

真正需要远程运行的本地扩展会在本地 - 已安装类别中显示为调暗并禁用。选择安装,在远程主机上安装扩展。

禁用带安装按钮的扩展

你也可以通过访问扩展视图,使用“本地已安装”标题栏右侧的云按钮,选择“在SSH中安装本地扩展:{Hostname},安装所有本地安装的扩展。它会显示一个下拉菜单,你可以选择在你的SSH主机上安装哪些本地安装的扩展。

“始终安装”扩展

如果你希望在任何SSH主机上都安装某些扩展,可以用偏远。SSH.default扩展财产settings.json.例如,如果你想安装 GitLensResource Monitor 扩展,请指定它们的扩展 ID: 如下:

"remote.SSH.defaultExtensions": [
    "eamodio.gitlens",
    "mutantdino.resourcemonitor"
]

高级:强制扩展在本地/远程运行

扩展通常设计和测试为本地运行或远程运行,而非两者兼有。不过,如果扩展支持它,你可以强制它在你的某个特定位置运行settings.json档案。

例如,下面的设置将强制容器工具扩展在本地运行,远程运行 - SSH: 编辑配置文件扩展名,而不是它们的默认扩展:

"remote.extensionKind": {
    "ms-azuretools.vscode-containers": [ "ui" ],
    "ms-vscode-remote.remote-ssh-edit": [ "workspace" ]
}

一个值为“ui”代替“工作空间”会强制扩展在本地UI/客户端运行。通常,除非扩展文档另有说明,否则这只应用于测试,因为这可能会破坏扩展。详情请参见“支持远程开发”一文。

端口转发/创建SSH隧道

有时在开发过程中,你可能需要访问远程机器上未公开的端口。有两种方法,使用SSH隧道将所需的远程端口“转发”到你的本地机器。

临时转发端口

连接主机后,如果你想在会话期间临时转发新端口,请从命令面板中选择“转发端口”(F1,Windows,Linux Ctrl+Shift+P),或在端口视图中选择添加端口按钮。你可以在底部面板看到端口视图,或者通过运行命令“端口:聚焦端口视图”来查看。

前进端口按钮

系统会要求你输入你想转发的端口,并可以给它命名。

添加新端口

通知会告诉你应该用哪个本地host端口来访问远程端口。例如,如果你转发了一个在端口3000监听的HTTP服务器,通知可能会告诉你它映射到了localhost的端口4123,因为3000端口已经在使用中。然后你可以用以下方式连接到这个远程 HTTP 服务器http://localhost:4123.

如果你之后需要访问,也可以在远程探索器的转发端口部分找到同样的信息。

如果你想让VS Code记住你转发过的任何端口,可以在设置编辑器中查看远程:恢复转发端口⌘,(Windows,Linux Ctrl+,)或设置“remote.restoreForwardedPorts”: truesettings.json.

恢复转发端口设置

在隧道中更改本地端口

如果你希望隧道的本地端口与远程服务器的不同,可以通过转发端口面板更改。

右键点击你想修改的隧道,然后在右键菜单中选择更改本地地址端口

更改本地地址端口

总是转发端口

如果你有想转发的端口,可以使用LocalForward指令放在你用来记忆主机和高级设置的同一个SSH配置文件里。

例如,如果你想转发端口3000和27017,可以按以下方式更新文件:

Host remote-linux-machine
    User myuser
    HostName remote-linux-machine.mydomain
    LocalForward 127.0.0.1:3000 127.0.0.1:3000
    LocalForward 127.0.0.1:27017 127.0.0.1:27017

在远程主机上打开终端

通过VS Code在远程主机上打开终端非常简单。一旦连接,你在 VS Code 中打开的任何终端窗口终端 > 新终端)都会自动在远程主机上运行,而不是本地运行。

你也可以使用代码在同一终端窗口中执行命令行作,如在远程主机上打开新文件或文件夹。类型代码——帮助查看命令行中所有可用的选项。

使用代码CLI的应用

SSH主机上的调试

一旦连接到远程主机,你可以像本地运行应用一样使用 VS Code 的调试器。例如,如果你在 中选择一个启动配置launch.json并开始调试(F5),应用程序将从远程主机启动并附加调试器。

有关配置 VS Code 调试功能的详细信息,请参见调试文档.vscode/launch.json.

SSH 主机特定设置

VS Code 的本地用户设置在连接到 SSH 主机时也会被重用。虽然这样可以保持用户体验的一致性,但你可能需要在本地机器和各主机之间调整部分设置。幸运的是,连接主机后,你也可以通过命令面板中的“偏好设置:打开远程设置”命令(F1,Windows,Linux Ctrl+Shift+P)或在设置编辑器中的远程选项卡中选择来设置特定主机设置。这些设置会覆盖你连接主机时的用户设置。工作区设置会覆盖远程和用户设置。

主机特定设置标签页

使用本地工具

远程 - SSH 扩展不直接支持与远程主机内容同步源代码或使用本地工具。不过,有两种方法可以通过通用工具实现,这些工具适用于大多数Linux主机。具体来说,你可以:

  1. 使用 SSHFS 挂载远程文件系统
  2. 通过以下方式将文件与远程主机同步到本地机器rsync.

SSHFS是最方便的选择,不需要任何文件同步。不过,性能会比运行 VS Code 慢得多,因此它最好用于单文件编辑和上传/下载内容。如果你需要使用批量读写多个文件的应用(比如本地源控工具),rsync是更好的选择。

已知的局限性

远程 - SSH 限制

  • 建议使用基于密钥的认证。输入的密码和其他用于替代认证方法的令牌不会被保存。
  • 不支持Alpine Linux和非glibc架构的Linux SSH主机。
  • 较老的(社区支持)Linux发行版需要通过变通方法安装所需的前置条件
  • PuTTY在Windows上不被支持。
  • 如果你用SSH克隆了一个Git仓库,且你的SSH密钥带有密码短语,VS Code的拉取和同步功能在远程运行时可能会卡住。要么用无密码的SSH密钥,要么用HTTPS克隆,要么直接运行Git 推送从命令行开始绕过这个问题。
  • 本地代理设置不会在远程主机上重用,这可能导致扩展无法正常工作,除非远程主机配置了相应的代理信息(例如全局代理)HTTP_PROXYHTTPS_PROXY环境变量,并配有相应的代理信息)。
  • 这里有与SSH相关的活跃问题列表

容器工具扩展的限制

如果你使用容器工具或Kubernetes扩展,来自WSL、远程隧道或远程SSH窗口,使用容器资源管理器或Kubernetes视图中的“附加Visual Studio代码”右键菜单作,会再次要求从可用容器中选择。

扩展限制

许多扩展可以在远程 SSH 主机上无需修改即可工作。然而,在某些情况下,某些功能可能需要更改。如果你遇到扩展问题,可以向扩展作者报告时,提供常见问题和解决方案的总结

此外,安装在 ARMv7l(AArch32)/ ARMv8l(AArch64)设备上的一些扩展可能无法使用,因为扩展中的原生模块或运行时仅支持 x86_64。在这种情况下,扩展需要选择支持这些平台,通过编译/包含 ARMv7l / ARMv8l 的二进制文件。

常见问题

我该如何在......上设置一个SSH客户端?

详情请参见“安装支持的SSH客户端”。

我该如何在......上搭建SSH服务器?

关于为主机设置SSH服务器的详细信息,请参见“安装支持的SSH服务器”。

我可以用其他或额外的认证机制(比如密码)登录我的SSH服务器吗?

是的,系统会提示你自动输入令牌或密码。然而,密码不会被保存,因此基于密钥的认证通常更为方便。

我该如何修复关于“权限错误”的SSH错误?

有关如何解决此类错误,请参见“修复SSH文件权限错误”。

需要在远程SSH主机上安装哪些Linux包/库?

大多数 Linux 发行版不需要额外的依赖安装步骤。对于SSH,Linux主机需要有Bash(/垃圾/砰),焦油,且卷曲WGET安装后,这些工具可能在某些简化版中缺失。远程开发还需要内核 >= 3.10,glibc 的 >=2.17,libstdc++ >= 3.4.18。目前仅支持基于 glibc 的发行版,因此 Alpine Linux 也不再被支持。

详情请参见Linux的前置条件

当VS Code服务器运行在远程机器/虚拟机上时,连接需求是什么?

安装VS Code服务器需要您的本地机器具备出站HTTPS(端口443)连接:

  • update.code.visualstudio.com
  • vscode.download.prss.microsoft.com

默认情况下,远程 - SSH 会尝试在远程主机上下载,并在建立连接后备份回本地下载 VS Code 服务器并远程传输。你可以用

偏远。SSH.localServerDownload
  • 在VS代码中打开
  • 在VS Code Insiders中开放
设置为始终本地下载然后转移,或者永远不本地下载。

你可以在没有网络连接的情况下手动安装扩展,使用扩展:从 VSIX... 安装命令,但如果你用扩展面板安装扩展,你的本地机器和 VS Code 服务器将需要通过 HTTPS(端口 443)访问:

  • marketplace.visualstudio.com
  • *.gallerycdn.vsassets.io(Azure CDN)

最后,一些扩展(比如 C#)会从 下载次级依赖download.microsoft.comdownload.visualstudio.microsoft.com.其他软件(如Visual Studio Live Share)可能有额外的连接需求。如果遇到问题,可以查阅扩展的文档获取详细信息。

服务器与VS Code客户端之间的所有其他通信均通过认证且安全的SSH隧道完成。

我可以用本地工具处理存储在远程SSH主机上的源代码吗?

是的。通常通过SSHFS或以下方式完成使用rsync获取本地机器上的文件副本。SSHFS 挂载远程文件系统非常适合需要编辑单个文件或浏览源树的场景,且无需同步步骤即可使用。不过,它并不适合用像源码控制工具这样批量管理文件的工具。在这种情况下,rsync更好的方法是你能在本地机器上获得完整的远程源代码副本。详情请参见技巧与窍门。

当我只能访问远程主机的SFTP/FTP文件系统(没有shell访问)时,我可以使用VS代码吗?

一些云平台仅为开发者提供远程文件系统访问,而非直接的shell访问。VS Code 远程开发并非为此设计,因为它抵消了性能和用户体验的提升。

然而,这种用例通常可以通过结合像SFTP这样的扩展和Node.jsPythonC#等远程调试功能来应对。

作为扩展作者,我需要做些什么?

VS Code 扩展 API 会抽象本地/远程细节,所以大多数扩展无需修改即可工作。然而,鉴于扩展可以使用任意节点模块或运行时,在某些情况下可能需要做出调整。我们建议您测试扩展,确保无需更新。详情请参见支持远程开发

问题或反馈