现已发布!阅读 10 月份的新功能和修复。

远程 SSH:技巧

2019 年 10 月 3 日,作者:Sana Ajani,@sana_ajani

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

使用远程 SSH 连接

Visual Studio Code 远程 - SSH 扩展允许您使用 SSH 连接到远程机器或 VM,所有操作都在 VS Code 中进行。如果您还没有安装此扩展,可以在扩展视图中搜索“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

有时您可能需要从台式机或笔记本电脑通过公司的 Intranet 或防火墙连接到远程机器。在这种情况下,您可能正在使用中间服务器或 跳板机。如果您在安全系统内工作,并且该系统配置为只接受来自固定主机集的 SSH 连接,则此类设置很有用。

要将跳板机设置与远程 - 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 主机,则可能需要多次输入所需的信息。

与其打开多个 SSH 连接,不如使用ControlMaster 选项(仅限 macOS/Linux 客户端)来重用现有连接,并减少输入密码短语的次数。

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

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

离线远程机器

如果您受到防火墙限制,或者您的公司锁定了您的 VM 并且它们无法连接到 Internet,那么远程 - SSH 扩展将无法连接到您的 VM,因为 VS Code 需要将一个名为 VS Code Server 的组件下载到远程机器。

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

注意:此功能目前处于实验阶段,但将在下一个版本中默认启用。

远程 - SSH Nightly 扩展

如果您有兴趣在最新更新和实验功能可用时立即进行测试,请安装 远程 - SSH Nightly 扩展(首先卸载远程-SSH 稳定版扩展)。这是扩展的夜间构建版本,我们在发布到稳定版之前会在其中试验新功能和设置。

我们希望收到您的反馈

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

祝您远程编码愉快!

Sana Ajani,VS Code 程序经理,@sana_ajani