远程 SSH:技巧与窍门
2019年10月3日,作者 Sana Ajani,@sana_ajani
在之前的远程 SSH 博客文章中,我们介绍了如何设置 Linux 虚拟机并通过 Visual Studio Code 中的Remote - SSH 扩展连接到该虚拟机。在这篇博文中,我们将介绍一些您可以用来充分利用远程设置的技巧和窍门。
使用远程 SSH 连接
Visual Studio Code Remote - SSH 扩展允许您直接在 VS Code 内部使用 SSH 连接到远程机器或虚拟机。如果您尚未安装该扩展,可以在“扩展”视图(⇧⌘X (Windows, Linux Ctrl+Shift+X))中搜索“remote ssh”。

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

SSH 配置文件
在早期的远程 SSH 博文中,我们只连接到一台机器,并且是通过在提示时输入“user@host”来完成的。如果您经常登录多台远程服务器或本地虚拟机,有一种更好的连接方式,而无需记住所有用户名、地址和额外的配置选项。
OpenSSH 支持使用配置文件来存储所有不同的 SSH 连接。要使用 SSH 配置文件,请单击远程指示器以显示远程命令,选择 **Open Configuration File**,然后选择遵循路径“Users/{yourusername}/.ssh/config”的文件。

这是 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”,并且“远程资源管理器”向我显示了过去连接的文件夹以及从远程机器转发的任何端口。

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 密钥,您可能需要多次输入所需的信息。
而不是打开多个 SSH 连接,您可以使用 ControlMaster 选项(仅适用于 macOS/Linux 客户端)来重用现有连接,从而减少输入口令的次数。
要使用此功能,请将以下内容添加到您的 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 稳定版扩展)。这是扩展的 nightly 构建版本,我们在其中试验新功能和设置,然后再发布到稳定版本中。
我们希望得到您的反馈
感谢您试用 Remote - SSH 扩展!如果您遇到任何问题或希望向我们建议新功能或场景,请在我们的GitHub 仓库上提交 issue。如果您想了解我们目前正在处理或即将推出的功能,请查看我们的 Remote Development 发布说明和迭代计划。您还可以尝试介绍性的通过 SSH 进行远程开发教程,其中将指导您使用其他远程扩展在 Docker 容器和适用于 Linux 的 Windows 子系统 (WSL) 中工作。
远程编码愉快!
Sana Ajani,VS Code 项目经理 @sana_ajani