在 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。

对于 x86_64、ARMv7l (AArch32) 和 ARMv8l (AArch64),如果它们具有所需的先决条件,其他基于 glibc 的 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. 通过在终端/PowerShell 窗口中运行以下命令验证您是否可以连接到 SSH 主机,根据需要替换 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: 连接到主机...,并使用与步骤 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. 按照安装步骤在您的远程主机上安装 Docker,并在本地安装 VS Code 和开发容器扩展。
  2. 可选: 设置 SSH 基于密钥的身份验证到服务器,这样你就无需多次输入密码。
  3. 按照 Remote - SSH 扩展的快速入门连接到主机并在那里打开一个文件夹。
  4. 使用命令面板(F1, ⇧⌘P (Windows, Linux Ctrl+Shift+P))中的 Dev Containers: 在容器中重新打开 命令。

开发容器快速入门的其余部分同样适用。你可以在 开发容器扩展文档中了解更多信息。如果此模式不符合你的需求,你还可以参阅 在远程 Docker 主机上开发文章以了解其他选项。

断开与远程主机的连接

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

记住主机和高级设置

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

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

首先从命令面板(F1, ⇧⌘P (Windows, Linux Ctrl+Shift+P))中选择 Remote-SSH: 添加新的 SSH 主机...,或单击活动栏中 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: 连接到主机...,或在 远程资源管理器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: {Hostname} 中安装本地扩展,将所有本地已安装的扩展安装到 SSH 主机上。这将显示一个下拉列表,您可以在其中选择要在 SSH 主机上安装哪些本地已安装的扩展。

“始终安装”的扩展

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

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

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

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

例如,以下设置将强制Docker 扩展在本地运行,而Remote - SSH: 编辑配置文件扩展在远程运行,而不是它们的默认行为:

"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))中选择转发端口,或在端口视图中选择添加端口按钮。你可以在底部面板中或通过运行命令 Ports: Focus on Ports View 来查看端口视图。

Forward port button

将要求您输入要转发的端口,您可以为其指定名称。

Adding a new port

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

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

如果你希望 VS Code 记住你已转发的任何端口,请在设置编辑器中选中远程: 还原转发的端口⌘, (Windows, Linux Ctrl+,)),或在 settings.json 中设置 "remote.restoreForwardedPorts": true

Restore forwarded ports setting

更改隧道上的本地端口

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

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

Change Local Address Port

始终转发端口

如果你有总是想转发的端口,你可以在用于记住主机和高级设置的 SSH 配置文件中使用 LocalForward 指令。

例如,如果您想转发端口 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)、tar 以及 curlwget,这些实用程序在某些精简的分发版中可能缺失。远程开发还需要内核 >= 3.10、glibc >=2.17、libstdc++ >= 3.4.18。目前仅支持基于 glibc 的分发版,因此Alpine Linux 不受支持。

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

VS Code Server 在远程机器/虚拟机上运行时有哪些连接要求?

安装 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 设置更改此行为,以始终在本地下载然后传输,或从不在本地下载。

你可以使用 Extensions: Install from VSIX... 命令在没有互联网连接的情况下手动安装扩展,但如果你使用扩展面板安装扩展,则你的本地计算机和 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 远程开发并未考虑到这种使用场景,因为它会抵消性能和用户体验优势。

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

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

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

问题或反馈