参加你附近的 ,了解 VS Code 中的 AI 辅助开发。

Remote SSH:提示与技巧

2019年10月3日,由 Sana Ajani (@sana_ajani) 发布

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

使用 Remote SSH 连接

Visual Studio Code 的 Remote - SSH 扩展允许你直接在 VS Code 内部通过 SSH 连接到远程机器或虚拟机。如果你尚未安装该扩展,可以在扩展视图 (⇧⌘X (Windows、Linux 为 Ctrl+Shift+X)) 中搜索 "remote ssh"。

Remote - SSH extension

安装扩展后,你会注意到状态栏左下角有一个指示器。这个指示器告诉你 VS Code 当前的运行环境(本地或远程)。点击该指示器,会弹出一个包含远程扩展命令的列表。

Remote extension commands

SSH 配置文件

在之前的 Remote SSH 博文中,我们只连接了一台机器,并且是在提示时输入 "user@host" 来实现的。如果你经常登录多台远程服务器或本地虚拟机,有一种更好的连接方式,无需记住所有的用户名、地址和额外的配置选项。

OpenSSH 支持使用配置文件来存储你所有的不同 SSH 连接。要使用 SSH 配置文件,请点击远程指示器调出远程命令,选择打开配置文件,然后选择路径为 "Users/{你的用户名}/.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

离线的远程机器

如果你的虚拟机受到防火墙限制或公司策略锁定而无法连接到互联网,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 仓库中提交问题。如果你想了解我们目前正在开发或即将推出的功能,请查看我们的远程开发发行说明迭代计划。你也可以尝试入门级的通过 SSH进行远程开发教程,它将引导你使用其他远程扩展在 Docker 容器和适用于 Linux 的 Windows 子系统(WSL)中工作。

远程编码愉快!

Sana Ajani,VS Code 项目经理 @sana_ajani