使用 SSH 进行远程开发
Visual Studio Code 远程 - SSH 扩展允许你在任何运行 SSH 服务器的远程机器、虚拟机或容器上打开远程文件夹,充分利用 VS Code 的功能集。一旦连接到服务器,你可以与远程文件系统中任何地方的文件和文件夹进行交互。
无需源代码存在于本地机器即可享受这些优势,因为扩展直接在远程机器上运行命令和其他扩展。该扩展会在远程作系统上安装 VS Code Server;服务器独立于远程作系统上任何现有的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位)。
- 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 原生代码,这些设备上安装的某些扩展可能无法使用。
安装
要开始,你需要:
-
如果还没有兼容OpenSSH的SSH客户端,请安装。
-
安装Remote-SSH扩展。如果你计划在 VS Code 中使用其他远程扩展,可以选择安装远程开发扩展包。
SSH主机设置
-
如果你还没有设置SSH主机,可以按照Linux、Windows 10 / Server (1803+)或macOS SSH主机的说明作,或者在Azure上创建一个虚拟机。
-
可选:如果您的Linux或macOS的SSH主机会被多个用户同时访问,建议在VS Code用户设置中启用Remote.SSH:远程服务器监听套接字,以提升安全性。
在设置编辑器中:

详情请参见“技巧与窍门”文章。
-
可选:虽然支持基于密码的认证,但我们建议为您的主机设置基于密钥的认证。详情请参见“技巧与窍门”文章。
连接到远程主机
首次连接远程主机时,请遵循以下步骤:
-
通过从终端或PowerShell窗口替换命令,验证你是否能连接到SSH主机
user@hostname视情况而定。ssh user@hostname # Or for Windows when using a domain / AAD account ssh user@domain@hostname -
在 VS Code 中,选择 Remote-SSH: Connect to Host......从命令面板(F1,⇧⌘P(Windows,Linux Ctrl+Shift+P))中选择,并使用相同设置
user@hostname也就是第一步。
-
如果VS Code无法自动检测你连接的服务器类型,系统会要求你手动选择服务器类型。

一旦你选择了平台,它就会被存储在VS Code设置里,下面是
偏远。SSH.remotePlatform所以你可以随时更改。 -
过一会儿,VS Code会连接到SSH服务器并自行设置。VS Code会通过进度通知让你随时了解情况,你还能在
远程 - SSH输出通道。提示:连接挂断或失败?请参阅故障排除技巧,了解如何解决常见问题。
如果你发现关于SSH文件权限的错误,请参见“修复SSH文件权限错误”部分。
-
连接后,你会进入一个空白窗口。你总可以查看状态栏,看看你连接的是哪位主机。

点击状态栏项目会显示连接时的远程命令列表。
-
然后你可以像本地一样,使用“打开文件”或“打开工作空间”文件>打开,打开远程机器上的任何文件夹或工作区>!

接着安装连接主机时想用的扩展,开始编辑吧!
注:在ARMv7l / ARMv8l
格利比克SSH主机,部分扩展可能因扩展内部的x86编译原生代码而无法工作。
在一个容器中的远程SSH主机上打开一个文件夹
如果你使用的是Linux或macOS的SSH主机,你可以同时使用Remote - SSH和开发容器扩展,在容器内打开远程主机上的文件夹。你甚至不需要本地安装 Docker 客户端。
具体做法:
- 按照安装步骤在远程主机上安装Docker,并在本地安装VS Code和Dev Containers扩展。
- 可选:设置基于SSH密钥的服务器认证,这样你就不需要多次输入密码。
- 按照远程-SSH扩展的快速启动作,连接到主机并打开一个文件夹。
- 使用命令面板中的开发容器:在容器中重新打开命令(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.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目标部分。

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

管理扩展
VS Code 在两个地方运行扩展:本地在 UI/客户端运行,或远程运行在 SSH 主机上。影响VS Code界面的扩展,比如主题和片段,会本地安装,但大多数扩展会安装在SSH主机上。这确保了你的流畅体验,并允许你从本地机器在 SSH 主机上安装特定工作空间所需的扩展。这样,你就可以从上次停下的地方继续,换成带有扩展的另一台机器。
如果你从扩展视图安装扩展,它会自动安装到正确的位置。安装后,你可以根据分类分组判断扩展安装的位置。
会有一个类别用于你的远程SSH主机:

还有一个本地安装类别:

注:如果您是扩展作者,发现扩展无法正常工作或安装在错误的位置,详情请参阅支持远程开发。
真正需要远程运行的本地扩展会在本地 - 已安装类别中显示为调暗并禁用。选择安装,在远程主机上安装扩展。

你也可以通过访问扩展视图,使用“本地已安装”标题栏右侧的云按钮,选择“在SSH中安装本地扩展:{Hostname},安装所有本地安装的扩展。它会显示一个下拉菜单,你可以选择在你的SSH主机上安装哪些本地安装的扩展。
“始终安装”扩展
如果你希望在任何SSH主机上都安装某些扩展,可以用偏远。SSH.default扩展财产settings.json.例如,如果你想安装 GitLens 和 Resource 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”: true在settings.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 中打开的任何终端窗口(终端 > 新终端)都会自动在远程主机上运行,而不是本地运行。
你也可以使用代码在同一终端窗口中执行命令行作,如在远程主机上打开新文件或文件夹。类型代码——帮助查看命令行中所有可用的选项。

SSH主机上的调试
一旦连接到远程主机,你可以像本地运行应用一样使用 VS Code 的调试器。例如,如果你在 中选择一个启动配置launch.json并开始调试(F5),应用程序将从远程主机启动并附加调试器。
有关配置 VS Code 调试功能的详细信息,请参见调试文档.vscode/launch.json.
SSH 主机特定设置
VS Code 的本地用户设置在连接到 SSH 主机时也会被重用。虽然这样可以保持用户体验的一致性,但你可能需要在本地机器和各主机之间调整部分设置。幸运的是,连接主机后,你也可以通过命令面板中的“偏好设置:打开远程设置”命令(F1,Windows,Linux Ctrl+Shift+P))或在设置编辑器中的远程选项卡中选择来设置特定主机设置。这些设置会覆盖你连接主机时的用户设置。工作区设置会覆盖远程和用户设置。

使用本地工具
远程 - SSH 扩展不直接支持与远程主机内容同步源代码或使用本地工具。不过,有两种方法可以通过通用工具实现,这些工具适用于大多数Linux主机。具体来说,你可以:
SSHFS是最方便的选择,不需要任何文件同步。不过,性能会比运行 VS Code 慢得多,因此它最好用于单文件编辑和上传/下载内容。如果你需要使用批量读写多个文件的应用(比如本地源控工具),rsync是更好的选择。
已知的局限性
远程 - SSH 限制
- 建议使用基于密钥的认证。输入的密码和其他用于替代认证方法的令牌不会被保存。
- 不支持Alpine Linux和非glibc架构的Linux SSH主机。
- 较老的(社区支持)Linux发行版需要通过变通方法安装所需的前置条件。
- PuTTY在Windows上不被支持。
- 如果你用SSH克隆了一个Git仓库,且你的SSH密钥带有密码短语,VS Code的拉取和同步功能在远程运行时可能会卡住。要么用无密码的SSH密钥,要么用HTTPS克隆,要么直接运行
Git 推送从命令行开始绕过这个问题。 - 本地代理设置不会在远程主机上重用,这可能导致扩展无法正常工作,除非远程主机配置了相应的代理信息(例如全局代理)
HTTP_PROXY或HTTPS_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.comvscode.download.prss.microsoft.com
默认情况下,远程 - SSH 会尝试在远程主机上下载,并在建立连接后备份回本地下载 VS Code 服务器并远程传输。你可以用
你可以在没有网络连接的情况下手动安装扩展,使用扩展:从 VSIX... 安装命令,但如果你用扩展面板安装扩展,你的本地机器和 VS Code 服务器将需要通过 HTTPS(端口 443)访问:
marketplace.visualstudio.com*.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代码吗?
一些云平台仅为开发者提供远程文件系统访问,而非直接的shell访问。VS Code 远程开发并非为此设计,因为它抵消了性能和用户体验的提升。
然而,这种用例通常可以通过结合像SFTP这样的扩展和Node.js、Python、C#等远程调试功能来应对。
作为扩展作者,我需要做些什么?
VS Code 扩展 API 会抽象本地/远程细节,所以大多数扩展无需修改即可工作。然而,鉴于扩展可以使用任意节点模块或运行时,在某些情况下可能需要做出调整。我们建议您测试扩展,确保无需更新。详情请参见支持远程开发。