🚀 在 VS Code 中

使用 SSH 进行远程开发

Visual Studio Code Remote - SSH 扩展允许您在任何运行 SSH 服务器的远程计算机、虚拟机或容器上打开远程文件夹,并充分利用 VS Code 的功能集。连接到服务器后,您可以与远程文件系统上任何位置的文件和文件夹进行交互。

无需将源代码放在本地计算机上即可获得这些好处,因为该扩展直接在远程计算机上运行命令和其他扩展。该扩展将在远程操作系统上安装 VS Code Server;该服务器独立于远程操作系统上的任何现有 VS Code 安装。

SSH Architecture

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

入门

注意:在查看本主题后,您可以开始学习入门级 SSH 教程

系统要求

本地: 必须也安装受支持的 OpenSSH 兼容 SSH 客户端

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

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

其他基于 glibc 的 x86_64、ARMv7l (AArch32) 和 ARMv8l (AArch64) Linux 发行版如果具有所需的先决条件,也应该可以工作。请参阅使用 Linux 进行远程开发文章,了解有关先决条件和使社区支持的发行版启动并运行的提示。

虽然 ARMv7l (AArch32) 和 ARMv8l (AArch64) 支持可用,但由于扩展中使用了 x86 本机代码,因此安装在这些设备上的一些扩展可能无法工作。

安装

要开始使用,您需要

  1. 安装 OpenSSH 兼容 SSH 客户端(如果尚未安装)。

  2. 安装 Visual Studio CodeVisual Studio Code Insiders

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

SSH 主机设置

  1. 如果您没有设置 SSH 主机,请按照 LinuxWindows 10 / Server (1803+)macOS SSH 主机的说明进行操作,或在 Azure 上创建 VM

  2. 可选: 如果您的 Linux 或 macOS SSH 主机将由多个用户同时访问,请考虑在 VS Code 用户设置中启用 Remote.SSH: Remote Server Listen On Socket 以提高安全性。

    在“设置”编辑器中

    Listen on socket VS Code setting

    有关详细信息,请参阅 技巧和窍门文章。

  3. 可选: 虽然支持基于密码的身份验证,但我们建议为您的主机设置基于密钥的身份验证。有关详细信息,请参阅技巧和窍门文章。

连接到远程主机

要首次连接到远程主机,请按照以下步骤操作

  1. 验证您是否可以连接到 SSH 主机,方法是从终端/PowerShell 窗口运行以下命令,并将 user@hostname 替换为适当的值。

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

    Illustration of user@host input box

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

    Illustration of platform selection

    选择平台后,它将存储在 VS Code 设置中的 remote.SSH.remotePlatform 属性下,以便您可以随时更改它。

  4. 稍等片刻,VS Code 将连接到 SSH 服务器并进行自身设置。VS Code 将使用进度通知让您了解最新情况,您可以在 Remote - SSH 输出通道中查看详细日志。

    提示: 连接挂起或失败?请参阅 故障排除提示,以获取有关解决常见问题的信息。

    如果您看到有关 SSH 文件权限的错误,请参阅有关修复 SSH 文件权限错误的部分。

  5. 连接后,您将进入一个空窗口。您可以随时参考状态栏,查看您连接到哪个主机。

    SSH Status bar item

    单击状态栏项将在您连接时提供远程命令列表。

  6. 然后,您可以使用 文件 > 打开...文件 > 打开工作区... 在远程计算机上打开任何文件夹或工作区,就像在本地一样!

    File Open on a remote SSH host

从这里开始,安装您想要在连接到主机时使用的任何扩展,然后开始编辑!

注意: 在 ARMv7l / ARMv8l glibc SSH 主机上,某些扩展可能由于扩展内部的 x86 编译的本机代码而无法工作。

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

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

为此,请执行以下操作

  1. 按照安装步骤在远程主机和本地 VS Code 以及 Dev Containers 扩展上安装 Docker。
  2. 可选: 设置 SSH 基于密钥的身份验证到服务器,这样您就不需要多次输入密码。
  3. 按照 Remote - SSH 扩展的快速入门连接到主机并在那里打开文件夹。
  4. 从命令面板 (F1⇧⌘P (Windows、Linux Ctrl+Shift+P)) 中使用 Dev Containers: Reopen in Container 命令。

其余的 Dev Containers 快速入门 照常适用。您可以在其文档中了解有关 Dev Containers 扩展的更多信息。如果此模型不能满足您的需求,您还可以查看在远程 Docker 主机上开发文章以了解其他选项。

断开与远程主机的连接

要在完成远程主机上的文件编辑后关闭连接,请选择 文件 > 关闭远程连接 以断开与主机的连接。默认配置不包含此命令的键盘快捷方式。您也可以直接退出 VS Code 以关闭远程连接。

记住主机和高级设置

如果您有一组经常使用的主机,或者您需要使用一些其他选项连接到主机,您可以将它们添加到遵循 SSH 配置文件格式的本地文件中。

为了简化设置,该扩展可以指导您添加主机,而无需手动编辑此文件。

首先从命令面板 (F1⇧⌘P (Windows、Linux Ctrl+Shift+P)) 中选择 Remote-SSH: Add New SSH Host...,或单击活动栏中 SSH 远程资源管理器中的 添加新 图标。

Remote Explorer Add New item

然后,系统将提示您输入 SSH 连接信息。您可以输入主机名

Remote Explorer SSH host input

或您将用于从命令行连接到主机的完整 ssh 命令

Remote Explorer SSH command input

最后,系统将提示您选择要使用的配置文件。如果您想使用与列出的配置文件不同的配置文件,您也可以在用户 settings.json 文件中设置 "remote.SSH.configFile" 属性。该扩展会处理其余部分!

例如,在输入框中输入 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 配置文件格式 支持的任何内容手动编辑此文件,因此这只是一个示例。

从现在开始,当您从命令面板 (F1⇧⌘P (Windows、Linux Ctrl+Shift+P)) 中选择 Remote-SSH: Connect to Host... 或在 远程资源管理器SSH 目标 部分中选择时,该主机将出现在主机列表中。

SSH targets in the Remote Explorer

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

Remote Explorer open folder

管理扩展

VS Code 在两个位置之一运行扩展:本地 UI / 客户端侧,或远程 SSH 主机上。虽然影响 VS Code UI 的扩展(如主题和代码片段)安装在本地,但大多数扩展将驻留在 SSH 主机上。这确保您拥有流畅的体验,并允许您从本地计算机在 SSH 主机上安装给定工作区所需的任何扩展。这样,您可以从另一台计算机上完全恢复上次中断的地方,并带有您的扩展。

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

将有一个适用于您的远程 SSH 主机的类别

Workspace Extension Category

以及一个 本地 - 已安装 类别

Local Extension Category

注意: 如果您是扩展作者,并且发现您的扩展无法正常工作或安装在错误的位置,请参阅 支持远程开发 了解详细信息。

实际上需要在远程运行的本地扩展将在 本地 - 已安装 类别中显示为灰色并禁用。选择 安装 以在远程主机上安装扩展。

Disabled Extensions w/Install Button

您还可以通过转到扩展视图,然后使用 本地 - 已安装 标题栏右侧的云按钮选择 在 SSH 中安装本地扩展: {主机名},从而在 SSH 主机上安装所有本地安装的扩展。这将显示一个下拉列表,您可以在其中选择要在 SSH 主机上安装的本地安装的扩展。

“始终安装”的扩展

如果有些扩展您希望始终安装在任何 SSH 主机上,您可以使用 settings.json 中的 remote.SSH.defaultExtensions 属性指定要安装的扩展。例如,如果您想安装 GitLensResource Monitor 扩展,请按如下方式指定它们的扩展 ID

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

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

扩展通常被设计和测试为在本地或远程运行,而不是两者都运行。但是,如果扩展支持,您可以强制它在 settings.json 文件中的特定位置运行。

例如,以下设置将强制 Docker 扩展在本地运行,Remote - SSH: Editing Configuration Files 扩展在远程运行,而不是它们的默认设置

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

"ui" 而不是 "workspace" 将强制扩展在本地 UI/客户端侧运行。通常,除非扩展文档中另有说明,否则这仅应用于测试,因为它可能会破坏扩展。有关详细信息,请参阅关于 支持远程开发 的文章。

转发端口 / 创建 SSH 隧道

有时在开发时,您可能需要访问远程计算机上未公开公开的端口。有两种方法可以使用 SSH 隧道 来完成此操作,该隧道“转发”所需的远程端口到您的本地计算机。

临时转发端口

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

Forward port button

系统将提示您输入要转发的端口,您可以为其命名。

Adding a new port

通知将告诉您应该使用哪个 localhost 端口来访问远程端口。例如,如果您转发了在端口 3000 上侦听的 HTTP 服务器,则通知可能会告诉您它已映射到 localhost 上的端口 4123,因为端口 3000 已在使用中。然后,您可以使用 https://127.0.0.1:4123 连接到此远程 HTTP 服务器。

如果您以后需要访问此信息,则可以在“远程资源管理器”的“转发端口”部分中找到相同的信息。

如果您希望 VS Code 记住您转发的任何端口,请在“设置”编辑器 (⌘, (Windows、Linux Ctrl+,)) 中选中 Remote: Restore Forwarded Ports,或在 settings.json 中设置 "remote.restoreForwardedPorts": true

Restore forwarded ports setting

更改隧道上的本地端口

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

右键单击要修改的隧道,然后在上下文菜单中选择 更改本地地址端口

Change Local Address Port

始终转发端口

如果您有始终想要转发的端口,您可以使用 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 中打开的任何终端窗口终端 > 新终端)都将在远程主机而不是本地主机上自动运行。

您还可以从此终端窗口使用 code 命令行执行许多操作,例如在远程主机上打开新文件或文件夹。键入 code --help 以查看命令行中可用的所有选项。

Using the code CLI

在 SSH 主机上调试

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

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

SSH 主机特定设置

当您连接到 SSH 主机时,VS Code 的本地用户设置也会被重用。虽然这使您的用户体验保持一致,但您可能希望在本地计算机和每个主机之间更改其中一些设置。幸运的是,连接到主机后,您还可以通过从命令面板 (F1⇧⌘P (Windows、Linux Ctrl+Shift+P)) 运行 首选项: 打开远程设置 命令,或通过在“设置”编辑器中选择 远程 选项卡来设置特定于主机的设置。每当您连接到主机时,这些设置都将覆盖您已设置的任何用户设置。工作区设置将覆盖远程设置和用户设置。

Host-specific settings tab

使用本地工具

Remote - SSH 扩展不直接支持同步源代码或将本地工具与远程主机上的内容一起使用。但是,有两种方法可以使用通用工具来完成此操作,这些工具适用于大多数 Linux 主机。具体来说,您可以

  1. 使用 SSHFS 挂载远程文件系统.
  2. 使用 rsync 将文件同步到远程主机和从远程主机同步到本地计算机.

SSHFS 是最方便的选项,不需要任何文件同步。但是,性能将明显低于通过 VS Code 工作时的性能,因此最适合用于单文件编辑和上传/下载内容。如果您需要使用一次性批量读取/写入多个文件的应用程序(如本地源代码管理工具),则 rsync 是更好的选择。

已知限制

Remote - SSH 限制

  • 建议使用基于密钥的身份验证。为 备用身份验证方法 输入的密码和其他令牌不会保存。
  • 不支持 Alpine Linux 和非 glibc 基础的 Linux SSH 主机。
  • 较旧的(社区支持的)Linux 发行版需要所需的先决条件的解决方法。
  • Windows 上不支持 PuTTY。
  • 如果您使用 SSH 克隆 Git 存储库,并且您的 SSH 密钥具有密码,则 VS Code 的拉取和同步功能在远程运行时可能会挂起。可以使用不带密码的 SSH 密钥,使用 HTTPS 克隆,或从命令行运行 git push 以解决此问题。
  • 本地代理设置不会在远程主机上重用,这可能会阻止扩展工作,除非在远程主机上配置了适当的代理信息(例如,具有适当代理信息的全局 HTTP_PROXYHTTPS_PROXY 环境变量)。
  • 有关与 SSH 相关的活动问题列表,请参阅此处

Docker 扩展限制

如果您从 WSL、Remote - Tunnels 或 Remote - SSH 窗口使用 Docker 或 Kubernetes 扩展,则在 Docker 或 Kubernetes 视图中使用 附加 Visual Studio Code 上下文菜单操作将要求第二次从可用容器中进行选择。

扩展限制

许多扩展无需修改即可在远程 SSH 主机上工作。但是,在某些情况下,某些功能可能需要更改。如果您遇到扩展问题,常见问题和解决方案摘要,您可以在报告问题时向扩展作者提及该摘要。

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

常见问题

如何在 ... 上设置 SSH 客户端?

有关详细信息,请参阅安装受支持的 SSH 客户端

如何在 ... 上设置 SSH 服务器?

有关为您的主机设置 SSH 服务器的详细信息,请参阅安装受支持的 SSH 服务器

我可以使用其他/附加身份验证机制(如密码)登录到我的 SSH 服务器吗?

是的,系统应会自动提示您输入令牌或密码。但是,密码不会保存,因此使用基于密钥的身份验证通常更方便。

如何修复有关“权限错误”的 SSH 错误?

有关解决这些类型错误的详细信息,请参阅修复 SSH 文件权限错误

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

大多数 Linux 发行版不需要额外的依赖项安装步骤。对于 SSH,Linux 主机需要安装 Bash (/bin/bash)、tarcurlwget,并且这些实用程序可能在某些精简的发行版中丢失。Remote Development 还要求内核 >= 3.10、glibc >= 2.17、libstdc++ >= 3.4.18。目前仅支持基于 glibc 的发行版,因此 Alpine Linux 也不受支持。

有关详细信息,请参阅Linux 先决条件

VS Code Server 在远程计算机/VM 上运行时有哪些连接要求?

安装 VS Code Server 要求您的本地计算机具有出站 HTTPS(端口 443)连接到

  • update.code.visualstudio.com
  • vscode.blob.core.windows.net
  • *.vo.msecnd.net (Azure CDN)

默认情况下,Remote - SSH 将尝试在远程主机上下载,并在建立连接后回退到本地下载 VS Code Server 并远程传输。您可以使用 remote.SSH.localServerDownload 设置更改此行为,以始终在本地下载然后再传输,或从不在本地下载。

您可以使用 扩展: 从 VSIX 安装... 命令手动安装扩展,而无需 Internet 连接,但如果您使用扩展面板安装扩展,则您的本地计算机和 VS Code Server 服务器将需要出站 HTTPS(端口 443)访问

  • marketplace.visualstudio.com
  • *.vo.msecnd.net (Azure CDN)
  • *.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 Code 吗?

某些云平台仅为开发人员提供远程文件系统访问权限,而不是直接 shell 访问权限。VS Code Remote Development 的设计并未考虑此用例,因为它否定了性能和用户体验优势。

但是,此用例通常可以通过将 SFTP 等扩展与 Node.jsPythonC# 或其他语言的远程调试功能结合使用来处理。

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

VS Code 扩展 API 抽象化了本地/远程详细信息,因此大多数扩展无需修改即可工作。但是,鉴于扩展可以使用他们想要的任何 node 模块或运行时,在某些情况下可能需要进行调整。我们建议您测试您的扩展,以确保不需要更新。有关详细信息,请参阅支持远程开发

问题或反馈