远程SSH:技巧与窍门

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

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

使用远程SSH连接

Visual Studio Code Remote - SSH 扩展允许你使用 SSH 连接到远程机器或虚拟机,所有这些操作都在 VS Code 内部完成。如果你还没有安装该扩展,你可以在扩展视图(⇧⌘X (Windows, Linux Ctrl+Shift+X))中搜索 "remote ssh"。

远程 - SSH 扩展

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

远程扩展命令

SSH 配置文件

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

OpenSSH 支持使用 配置文件 来存储所有不同的 SSH 连接。要使用 SSH 配置文件,请点击远程指示器以调出远程命令,选择 打开配置文件,然后选择路径为 "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了解更多关于配置选项的信息。

上面使用的选项是:

Option Description
Host An easy-to-remember alias for your host machine.
HostName The hostname of server (you can use the IP address of the server).
User The user you've specified to log in to the machine via SSH.
Port The port used to connect via SSH. The default port is 22, but if you've specified a unique port, you can configure it here.
IdentityFile The file location where you've stored your private key.

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

连接到python-linux-vm主机

代理命令

有时你可能需要从你的桌面或笔记本电脑通过公司的内网或防火墙连接到远程机器。在这种情况下,你可能会使用一个中间服务器或跳板机。如果你在一个安全系统中工作,该系统配置为仅接受来自一组固定主机的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

控制主控

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

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

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

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

离线远程机器

如果您受到防火墙的限制,或者您的公司锁定了您的虚拟机,导致它们无法连接到互联网,那么Remote - SSH扩展将无法连接到您的虚拟机,因为VS Code需要下载一个名为VS Code Server的组件到远程机器上。

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

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

远程 - SSH 夜间扩展

如果您有兴趣在最新更新和实验性功能一发布就进行测试,请安装Remote - SSH Nightly 扩展(首先卸载 Remote-SSH 稳定版扩展)。这是该扩展的夜间构建版本,我们在将新功能和设置发布到稳定版之前在此进行实验。

我们希望得到您的反馈

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

远程编码愉快,

Sana Ajani, VS Code 项目经理 @sana_ajani