使用 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 位)。
  • 使用 官方 OpenSSH Server 的 Windows 10 / Server 2016/2019 (1803+)。
  • macOS 10.14+ (Mojave) SSH 主机,需启用远程登录 (Remote Login)
  • 远程主机需要 1 GB 内存,但建议至少 2 GB 内存和 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 上创建一个虚拟机

  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: 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...File > Open Workspace... 打开远程机器上的任何文件夹或工作区!

    File Open on a remote SSH host

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

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

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

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

操作步骤如下:

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

Dev Containers 快速入门的其余部分按原样适用。您可以在其文档中了解更多关于 Dev Containers 扩展的信息。如果此模式无法满足您的需求,您还可以参阅在远程 Docker 主机上开发文章了解其他选项。

从远程主机断开连接

当您完成对远程主机上文件的编辑后,请选择 File > Close Remote Connection 以从主机断开连接。默认配置不包含此命令的键盘快捷键。您也可以简单地退出 VS Code 以关闭远程连接。

记住主机和高级设置

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

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

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

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... 或在 Remote ExplorerSSH Targets 部分中,该主机将出现在主机列表中。

SSH targets in the Remote Explorer

远程资源管理器 (Remote Explorer) 允许您在远程主机上打开一个新的空窗口,或直接打开您之前打开过的文件夹。展开主机,然后单击要打开的文件夹旁边的 Open Folder 图标。

Remote Explorer open folder

管理扩展

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

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

将有一个针对您远程 SSH 主机的类别

Workspace Extension Category

还有一个 Local - Installed 类别

Local Extension Category

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

实际上需要在远程运行的本地扩展将在 Local - Installed 类别中显示为变暗并禁用。选择 Install 以在您的远程主机上安装扩展。

Disabled Extensions w/Install Button

您还可以通过转到“扩展”视图,并使用 Local - Installed 标题栏右侧的云图标选择 Install Local Extensions in SSH: {Hostname},将所有本地安装的扩展安装到 SSH 主机上。这将显示一个下拉菜单,供您选择要在 SSH 主机上安装哪些本地已安装的扩展。

“总是安装”扩展

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

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

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

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

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

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

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

端口转发 / 创建 SSH 隧道

开发时,有时可能需要访问远程机器上未公开的端口。使用 SSH 隧道将所需的远程端口“转发”到您的本地机器,有两种方法可以做到这一点。

临时转发端口

连接到主机后,如果您想在会话期间临时转发一个新端口,请从命令面板(F1⇧⌘P(Windows, Linux Ctrl+Shift+P)中选择 Forward a Port,或者选择 Ports view 中的 Add Port 按钮。您可以在底部面板中查看端口视图,或者运行命令 Ports: Focus on Ports View

Forward port button

系统将提示您输入要转发的端口,您可以为其指定一个名称。

Adding a new port

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

如果您以后需要访问它,可以在远程资源管理器的 Forwarded Ports 部分中找到此信息。

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

Restore forwarded ports setting

更改隧道上的本地端口

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

右键单击要修改的隧道,然后从上下文菜单中选择 Change Local Address Port

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 中打开的任何终端窗口Terminal > New Terminal)都将自动在远程主机上运行,而不是在本地。

您还可以从同一个终端窗口使用 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)运行 Preferences: Open Remote Settings 命令,或通过选择设置编辑器中的 Remote 选项卡来设置主机特定设置。这些设置将覆盖您在连接主机时启用的任何用户设置。而工作区设置将覆盖远程和用户设置。

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 相关的活跃问题列表

容器工具扩展限制

如果您从 WSL、Remote - Tunnels 或 Remote - SSH 窗口中使用 Container Tools 或 Kubernetes 扩展,使用容器资源管理器 (Container Explorer) 或 Kubernetes 视图中的 Attach Visual Studio Code 上下文菜单操作时,系统会第二次要求从可用容器中进行选择。

扩展限制

许多扩展无需修改即可在远程 SSH 主机上工作。但是,在某些情况下,特定功能可能需要更改。如果您遇到扩展问题,请参阅常见问题和解决方案摘要,在报告问题时可以将其提供给扩展开发者。

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

常见问题

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

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

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

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

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

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

如何修复有关“权限错误 (bad permissions)”的 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.download.prss.microsoft.com

默认情况下,Remote - SSH 将尝试在远程主机上下载,如果失败,则会在连接建立后退回到在本地下载 VS Code Server 并将其传输到远程。您可以使用 remote.SSH.localServerDownload 在 VS Code 中打开 在 VS Code Insiders 中打开 设置来更改此行为,以始终先在本地下载再进行传输,或者从不在本地下载。

您可以使用 Extensions: Install from VSIX... 命令在没有互联网连接的情况下手动安装扩展,但如果您使用扩展面板安装扩展,您的本地机器和 VS Code Server 将需要前往以下地址的出站 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 Code 吗?

某些云平台只为开发人员提供远程文件系统访问权限,而不是直接的 Shell 访问权限。VS Code 远程开发并非为这种用例设计,因为它否定了性能和用户体验方面的优势。

然而,通过结合使用 SFTP 扩展和针对 Node.jsPythonC# 等的远程调试功能,通常可以处理此用例。

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

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

问题或反馈

© . This site is unofficial and not affiliated with Microsoft.