使用 SSH 进行远程开发
Visual Studio Code 远程 - SSH 扩展允许您在任何运行 SSH 服务器的远程机器、虚拟机或容器上打开远程文件夹,并充分利用 VS Code 的功能集。连接到服务器后,您可以与远程文件系统上的任何文件和文件夹进行交互。
由于扩展直接在远程机器上运行命令和其他扩展,因此您不需要在本地机器上拥有源代码即可获得这些好处。
这使 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 位)。
- 使用官方 OpenSSH 服务器 的 Windows 10 / Server 2016/2019 (1803+)。
- 已启用远程登录 的 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 本地代码。
安装
要开始,您需要
-
如果尚未存在,请安装OpenSSH 兼容 SSH 客户端。
-
安装远程 - SSH 扩展。如果您计划在 VS Code 中使用其他远程扩展,则可以选择安装远程开发扩展包。
SSH 主机设置
-
如果您没有设置 SSH 主机,请按照有关Linux、Windows 10 / Server (1803+) 或macOS SSH 主机的说明进行操作,或者创建一个Azure 上的 VM。
-
可选:如果您的 Linux 或 macOS SSH 主机将被多个用户同时访问,请考虑在 VS Code 的用户设置中启用远程.SSH:远程服务器在套接字上监听,以提高安全性。
在“设置”编辑器中
有关详细信息,请参阅技巧和窍门 文章。
-
可选:虽然支持基于密码的身份验证,但我们建议为您的主机设置基于密钥的身份验证。有关详细信息,请参阅技巧和窍门 文章。
连接到远程主机
要首次连接到远程主机,请执行以下步骤
-
通过在终端 / PowerShell 窗口中运行以下命令(适当地替换
user@hostname
)来验证您是否可以连接到 SSH 主机。ssh user@hostname # Or for Windows when using a domain / AAD account ssh user@domain@hostname
-
在 VS Code 中,从命令面板(F1,⇧⌘P (Windows、Linux Ctrl+Shift+P))选择远程 - SSH:连接到主机...,并使用与步骤 1 中相同的
user@hostname
。 -
如果 VS Code 无法自动检测您要连接到的服务器类型,系统会要求您手动选择类型。
选择平台后,它将存储在VS Code 设置中的
remote.SSH.remotePlatform
属性下,以便您可以随时更改它。 -
片刻后,VS Code 将连接到 SSH 服务器并进行设置。VS Code 将使用进度通知随时为您更新,您可以在“远程 - SSH”输出通道中查看详细日志。
提示:连接挂起或失败?有关解决常见问题的详细信息,请参阅故障排除技巧。
如果您看到有关 SSH 文件权限的错误,请参阅有关修复 SSH 文件权限错误 的部分。
-
连接后,您将处于一个空窗口中。您始终可以参考状态栏以查看您连接到的主机。
单击状态栏项目将在连接时提供远程命令列表。
-
然后,您可以使用文件 > 打开...或文件 > 打开工作区...打开远程机器上的任何文件夹或工作区,就像您在本地执行的操作一样!
从这里开始,安装您希望在连接到主机时使用的任何扩展,然后开始编辑!
注意:在 ARMv7l / ARMv8l
glibc
SSH 主机上,一些扩展可能无法正常工作,因为扩展内部包含 x86 编译的本地代码。
在容器中打开远程 SSH 主机上的文件夹
如果您使用的是 Linux 或 macOS SSH 主机,您可以将“远程 - SSH”和开发容器 扩展结合使用,以在远程主机上的容器内打开文件夹。您甚至不需要在本地安装 Docker 客户端。
为此,请执行以下操作
- 按照安装步骤在远程主机上安装 Docker,并在本地安装 VS Code 和“开发容器”扩展。
- 可选:设置 SSH基于密钥的身份验证,以便您无需多次输入密码。
- 按照快速入门,使用“远程 - SSH”扩展连接到主机并在那里打开文件夹。
- 从命令面板(F1,⇧⌘P (Windows、Linux Ctrl+Shift+P))使用开发容器:在容器中重新打开命令。
其余的开发容器快速入门照常适用。您可以在开发容器扩展的文档中了解有关该扩展的更多信息。如果您当前的模型无法满足您的需求,还可以查看在远程 Docker 主机上进行开发文章以了解其他选项。
断开与远程主机的连接
当您完成对远程主机的文件编辑后,选择 **文件 > 关闭远程连接** 以断开与主机的连接。默认配置不包含此命令的键盘快捷键。您也可以直接退出 VS Code 来关闭远程连接。
记住主机和高级设置
如果您有一组经常使用的主机,或者您需要使用一些其他选项连接到主机,您可以将它们添加到遵循 SSH 配置文件格式 的本地文件。
为了简化设置,该扩展可以指导您添加主机,而无需手动编辑此文件。
首先从命令面板选择 **远程-SSH: 添加新的 SSH 主机...** (F1,⇧⌘P (Windows, Linux Ctrl+Shift+P)) 或单击 SSH **远程资源管理器** 中的 **添加新** 图标。
然后系统将要求您输入 SSH 连接信息。您可以输入主机名
或者您将在命令行中用于连接到主机的完整 ssh
命令
最后,系统将要求您选择要使用的配置文件。如果您想使用与列出的配置文件不同的配置文件,您也可以在您的用户 settings.json
文件中设置 "remote.SSH.configFile"
属性。扩展将处理其余工作!
例如,在输入框中输入 ssh -i ~/.ssh/id_rsa-remote-ssh [email protected]
将生成以下条目
Host remotehost.yourcompany.com
User yourname
HostName another-host-fqdn-or-ip-goes-here
IdentityFile ~/.ssh/id_rsa-remote-ssh
有关生成此处显示的密钥的详细信息,请参阅 提示和技巧。您可以使用 SSH 配置文件格式 支持的任何内容手动编辑此文件,因此这只是一个示例。
从现在起,当您从命令面板选择 **远程-SSH: 连接到主机...** (F1,⇧⌘P (Windows, Linux Ctrl+Shift+P)) 或在 **远程资源管理器** 的 **SSH 目标** 部分时,该主机将显示在主机列表中。
**远程资源管理器** 允许您在远程主机上打开一个新的空窗口,或直接打开您之前打开的文件夹。展开主机并单击您想在主机上打开的文件夹旁边的 **打开文件夹** 图标。
管理扩展
VS Code 在两个地方之一运行扩展:本地在 UI / 客户端侧,或远程在 SSH 主机上。虽然影响 VS Code UI 的扩展(例如主题和代码片段)是本地安装的,但大多数扩展将驻留在 SSH 主机上。这确保您拥有流畅的体验,并允许您从本地计算机在 SSH 主机上为给定的工作区安装任何需要的扩展。这样,您就可以从不同的计算机上继续您的工作,并带有您的扩展。
如果您从扩展视图安装扩展,它将自动安装在正确的位置。安装后,您可以根据类别分组判断扩展的安装位置。
将有一个用于您的远程 SSH 主机的类别
还有一个 **本地 - 已安装** 类别
**注意:** 如果您是扩展作者,发现您的扩展无法正常工作或安装在错误的位置,请参阅 支持远程开发 了解详细信息。
实际上需要远程运行的本地扩展将在 **本地 - 已安装** 类别中显示为灰显且禁用。选择 **安装** 以在远程主机上安装扩展。
您也可以通过转到扩展视图并使用 **本地 - 已安装** 标题栏右侧的云按钮选择 **在 SSH: {Hostname} 中安装本地扩展** 来在 SSH 主机上安装所有本地安装的扩展。这将显示一个下拉菜单,您可以在其中选择要在 SSH 主机上安装的本地安装的扩展。
“始终安装”扩展
如果您希望某些扩展始终安装在任何 SSH 主机上,您可以使用 settings.json
中的 remote.SSH.defaultExtensions
属性指定哪些扩展。例如,如果您想安装 GitLens 和 资源监视器 扩展,请按如下所示指定它们的扩展 ID
"remote.SSH.defaultExtensions": [
"eamodio.gitlens",
"mutantdino.resourcemonitor"
]
高级:强制扩展在本地/远程运行
扩展通常被设计和测试为在本地或远程运行,而不是两者都运行。但是,如果扩展支持,您可以在 settings.json
文件中强制它在特定位置运行。
例如,以下设置将强制 Docker 扩展在本地运行,并将 远程 - 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)) 或选择 **端口视图** 中的 **添加端口** 按钮。您可以在底部面板中看到端口视图,或者通过运行命令 **端口: 聚焦端口视图** 来查看。
系统将要求您输入要转发的端口,您可以为它命名。
通知将告诉您应使用哪个本地主机端口访问远程端口。例如,如果您转发了侦听端口 3000 的 HTTP 服务器,通知可能会告诉您它被映射到本地主机上的端口 4123,因为 3000 已经被使用。然后,您可以使用 https://127.0.0.1:4123
连接到此远程 HTTP 服务器。
如果您以后需要访问此信息,它也可以在远程资源管理器的 **转发端口** 部分找到。
如果您希望 VS Code 记住您转发的任何端口,请在设置编辑器中选中 **远程: 恢复转发端口** (⌘, (Windows, Linux Ctrl+,)) 或在 settings.json
中设置 "remote.restoreForwardedPorts": true
。
更改隧道上的本地端口
如果您希望隧道的本地端口与远程服务器的本地端口不同,可以通过 **转发端口** 面板更改它。
右键单击要修改的隧道,然后在上下文菜单中选择 **更改本地地址端口**。
始终转发端口
如果您有 **始终要转发** 的端口,可以使用与用于 记住主机和高级设置 的相同 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
以查看命令行提供的所有选项。
在 SSH 主机上调试
连接到远程主机后,您可以像在本地运行应用程序时一样使用 VS Code 的调试器。例如,如果您在 launch.json
中选择启动配置并开始调试 (F5),应用程序将在远程主机上启动并调试器将附加到它。
有关在 .vscode/launch.json
中配置 VS Code 调试功能的详细信息,请参阅 调试 文档。
SSH 主机特定设置
当您连接到 SSH 主机时,VS Code 的本地用户设置也会被重用。虽然这可以让您的用户体验保持一致,但您可能希望在本地计算机和每个主机之间更改一些设置。幸运的是,连接到主机后,您也可以通过从命令面板运行 **首选项: 打开远程设置** 命令来设置特定于主机的设置 (F1,⇧⌘P (Windows, Linux Ctrl+Shift+P)) 或通过在设置编辑器中选择 **远程** 选项卡。这些设置将在您连接到主机时覆盖您已设置的任何用户设置。工作区设置将覆盖远程设置和用户设置。
使用本地工具
远程 - SSH 扩展不提供直接支持同步源代码或使用本地工具与远程主机上的内容进行交互。但是,可以使用与大多数 Linux 主机兼容的常用工具来实现这一点,具体方法有两种。
SSHFS 是最方便的选择,不需要任何文件同步。但是,性能将比通过 VS Code 工作慢得多,因此最好用于单文件编辑以及上传/下载内容。如果您需要使用一次性批量读/写许多文件的应用程序(例如本地源代码控制工具),rsync
是更好的选择。
已知限制
远程 - SSH 限制
- 建议使用基于密钥的身份验证。输入的用于 替代身份验证方法 的密码和其他令牌不会被保存。
- 不支持 Alpine Linux 和非 glibc 基于的 Linux SSH 主机。
- 较旧的(社区支持)Linux 发行版需要变通方法才能安装必要的先决条件。
- Windows 上不支持 PuTTY。
- 如果使用 SSH 克隆 Git 仓库,并且 SSH 密钥有密码,则 VS Code 的拉取和同步功能在远程运行时可能会挂起。可以使用没有密码的 SSH 密钥,使用 HTTPS 克隆,或者从命令行运行
git push
来解决此问题。 - 本地代理设置不会在远程主机上重用,这可能会阻止扩展正常工作,除非在远程主机上配置了相应的代理信息(例如,具有相应代理信息的全局
HTTP_PROXY
或HTTPS_PROXY
环境变量)。 - 有关 SSH 的活动问题列表,请点击这里。
Docker 扩展限制
如果您从 WSL、Remote - Tunnels 或 Remote - SSH 窗口使用 Docker 或 Kubernetes 扩展,则在 Docker 或 Kubernetes 视图中使用 附加 Visual Studio Code 上下文菜单操作时,会要求您再次从可用容器中进行选择。
扩展限制
许多扩展可以在远程 SSH 主机上正常工作,无需修改。但是,在某些情况下,某些功能可能需要更改。如果您遇到扩展问题,可以查看常见问题和解决方案的摘要,并在报告问题时将其提供给扩展作者。
此外,在 ARMv7l(AArch32)/ ARMv8l(AArch64)设备上安装的一些扩展可能无法正常工作,因为扩展中的本机模块或运行时仅支持 x86_64。在这种情况下,扩展需要通过编译/包含 ARMv7l/ARMv8l 的二进制文件来选择支持这些平台。
常见问题
如何在...上设置 SSH 客户端?
有关详细信息,请参阅安装支持的 SSH 客户端。
如何在...上设置 SSH 服务器?
有关为您的主机设置 SSH 服务器的详细信息,请参阅安装支持的 SSH 服务器。
我可以使用其他/额外的身份验证机制(如密码)登录我的 SSH 服务器吗?
是的,系统会提示您自动输入您的令牌或密码。但是,密码不会保存,因此使用基于密钥的身份验证通常更方便。
如何修复有关“权限错误”的 SSH 错误?
有关解决这些类型错误的详细信息,请参阅修复 SSH 文件权限错误。
需要在远程 SSH 主机上安装哪些 Linux 包/库?
大多数 Linux 发行版不需要额外的依赖项安装步骤。对于 SSH,Linux 主机需要安装 Bash(/bin/bash
)、tar
以及 curl
或 wget
,而这些实用程序可能在某些精简的发行版中缺失。远程开发还要求内核 >= 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 设置来更改此行为,以始终在本地下载并传输,或从不本地下载。
您可以使用 扩展:从 VSIX 安装... 命令手动安装扩展,而无需互联网连接,但是如果您使用扩展面板安装扩展,则您的本地机器和 VS Code Server 服务器需要到以下地址的出站 HTTPS(端口 443)访问权限:
marketplace.visualstudio.com
*.vo.msecnd.net
(Azure CDN)*.gallerycdn.vsassets.io
(Azure CDN)
最后,一些扩展(如 C#)从 download.microsoft.com
或 download.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.js、Python、C# 或其他语言的远程调试功能来解决。
作为扩展作者,我需要做什么?
VS Code 扩展 API 抽象了本地/远程细节,因此大多数扩展无需修改即可正常工作。但是,考虑到扩展可以使用任何它们想要的节点模块或运行时,在某些情况下可能需要进行调整。我们建议您测试您的扩展,以确保不需要进行任何更新。有关详细信息,请参阅支持远程开发。
问题或反馈
- 请参阅技巧和窍门或常见问题解答。
- 在Stack Overflow 上搜索。
- 添加功能请求或报告问题。
- 为我们的文档或VS Code 本身做出贡献。
- 有关详细信息,请参阅我们的CONTRIBUTING 指南。