🚀 在 VS Code 中

远程 SSH:技巧与窍门

Sana Ajani,@sana_ajani,2019 年 10 月 3 日

在之前的远程 SSH 博客文章中,我们介绍了如何设置 Linux 虚拟机并使用 Visual Studio Code 中的Remote - SSH 扩展连接到虚拟机。在这篇博客文章中,我们将深入探讨一些技巧与窍门,您可以利用它们来充分利用远程设置。

使用远程 SSH 连接

Visual Studio Code Remote - SSH 扩展允许您从 VS Code 内部使用 SSH 连接到远程计算机或虚拟机。如果您尚未安装该扩展,则可以在“扩展”视图中搜索“remote ssh”(⇧⌘X (Windows,Linux Ctrl+Shift+X))。

Remote - SSH extension

安装扩展后,您会在状态栏的左下角注意到一个指示器。此指示器告诉您 VS Code 在哪个上下文中运行(本地或远程)。单击指示器以调出远程扩展命令列表。

Remote extension commands

SSH 配置文件

在早期的远程 SSH 博客文章中,我们仅连接到一台计算机,并且在提示时输入“user@host”来完成连接。如果您定期登录到多个远程服务器或本地虚拟机,则有一种更好的连接方式,无需记住所有用户名、地址和其他配置选项。

OpenSSH 支持使用配置文件来存储所有不同的 SSH 连接。要使用 SSH 配置文件,请单击远程指示器以调出远程命令,选择打开配置文件,然后选择路径为“Users/{yourusername}/.ssh/config”的文件。

Open Configuration File command

以下是 SSH 配置文件的示例

# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
Host python-linux-vm
    HostName <vm address>
    User sana
    IdentityFile ~/.ssh/id_python_vm

Host node-vm
    HostName <vm address>
    User sana
    Port 5522
    IdentityFile ~/.ssh/id_node_vm

您可以在 SSH 配置文件格式中指定更多配置选项。您将在此文件中获得补全和着色,并且可以按 (⌃Space (Windows,Linux Ctrl+Space)) 以获取 IntelliSense,从而了解有关配置选项的更多信息。

上面使用的选项是

选项 描述
Host 主机别名,方便您记忆。
HostName 服务器的主机名(您可以使用服务器的 IP 地址)。
User 您指定的通过 SSH 登录到计算机的用户。
Port 用于通过 SSH 连接的端口。默认端口为 22,但如果您指定了唯一端口,则可以在此处配置。
IdentityFile 您存储私钥的文件位置。

您可以添加所有主机的相关信息。保存配置文件后,您将能够在远程资源管理器中看到这些主机,以及您在该主机上打开的任何文件夹。您可以选择每个主机或文件夹旁边的图标,它将启动一个新的 VS Code 窗口(实例)并将您连接到该主机。在下面的屏幕截图中,我已连接到我的远程计算机“python-linux-vm”,远程资源管理器向我显示了我过去连接到的文件夹,以及来自远程计算机的任何转发端口。

Connected to python-linux-vm host machine

ProxyCommand

有时,您可能需要从桌面或笔记本电脑通过公司内网或防火墙连接到远程计算机。在这种情况下,您可能正在使用中间服务器或跳板机。如果您在配置为仅接受来自固定主机集的 SSH 连接的安全系统内工作,则这种设置非常有用。

要将跳板机设置与 Remote - SSH 扩展一起使用,您可以使用 ProxyCommand 配置选项。此配置将打开与跳板机的后台 SSH 连接,然后通过专用 IP 地址连接到目标。

您可以在 SSH 配置文件中设置 ProxyCommand 配置选项,如下所示

# Jump box with public IP address
Host jump-box
    HostName 52.179.157.97
    User sana
    IdentityFile ~/.ssh/jumpbox

# Target machine with private IP address
Host target-box
    HostName <IP address of target>
    User sana
    IdentityFile ~/.ssh/target
    ProxyCommand ssh -q -W %h:%p jump-box

ControlMaster

如果您使用密钥身份验证以外的其他身份验证方法(例如双因素身份验证、基于密码的身份验证或带有密码的 SSH 密钥)连接到远程 SSH 主机,则可能需要多次输入所需的信息。

您可以使用 ControlMaster 选项(仅在 macOS/Linux 客户端上可用)来重用现有连接并减少必须输入密码的次数,而不是打开多个 SSH 连接。

要使用此功能,请将以下内容添加到您的 SSH 配置文件中

Host *
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%r@%h-%p
    ControlPersist 600

离线远程计算机

如果您的虚拟机受到防火墙的限制或被公司锁定,并且无法连接到 Internet,则 Remote - SSH 扩展将无法连接到您的虚拟机,因为 VS Code 需要将名为 VS Code Server 的组件下载到远程计算机。

但是,现在您可以通过 Remote - SSH 扩展中的新用户设置来解决此问题。如果您启用 remote.SSH.allowLocalServerDownload 设置,则扩展将首先在客户端上安装 VS Code Server,然后通过 SCP 将其复制到服务器。

注意:这目前是一项实验性功能,但在下一个版本中将默认启用。

Remote - SSH Nightly 扩展

如果您有兴趣尽快测试新更新和实验性功能,请安装Remote - SSH Nightly 扩展(首先卸载 Remote-SSH 稳定版扩展)。这是扩展的每夜构建版,我们会在其中试验新功能和设置,然后再将其发布到稳定版本中。

我们希望听到您的反馈

感谢您试用 Remote - SSH 扩展!如果您遇到任何问题,或者想为我们建议新功能或场景,请在我们的GitHub 仓库上打开一个 issue。如果您想查看我们当前正在开发或即将推出的功能,请查看我们的远程开发发布说明迭代计划。您还可以尝试入门级的通过 SSH 进行远程开发教程,该教程将引导您使用其他远程扩展在 Docker 容器和Windows Linux 子系统 (WSL) 中工作。

远程编码愉快,

Sana Ajani,VS Code 项目经理 @sana_ajani