在 VS Code 中试用

使用 Visual Studio Code 进行远程 SSH

2019 年 7 月 25 日,作者 Sana Ajani,@sana_ajani

远程 - SSH:轻松、顺畅、(如同)本地体验

如果您还没有听说,Visual Studio Code 最近发布了远程开发扩展。通过远程扩展,您可以使用 VS Code 及其完整的功能集作为开发环境,针对容器、远程计算机或虚拟机 (VM),或者适用于 Linux 的 Windows 子系统 (WSL) 进行开发。

Remote SSH architecture

无限可能:您不受本地机器的束缚

越来越多的开发者从事大型复杂项目,这些项目需要他们在专业的开发虚拟机或服务器上工作,这些虚拟机或服务器比普通笔记本电脑提供更多的存储或计算能力。

然而,这种开发方式也带来了一些挑战

  • 如果您使用远程访问软件(如 VNC),编辑时可能会遇到延迟,因为您的 UI 不再是本地的。
  • 如果您使用远程桌面协议 (RDP),管理多个连接可能会很困难。
  • 挂载远程文件系统和执行批量操作可能很慢。
  • 保持远程和本地环境同步很麻烦,而且您经常会遇到在某个地方能工作但在另一处却不行的问题。
  • 使用 SSH 和 Vim 远程编辑文件意味着您无法在您惯用的代码编辑器中获得舒适体验。

如果能够摆脱本地机器的物理限制,同时又不放弃您的工具,岂不是太棒了。现在,远程 - SSH 扩展的魔力就来了。

使用 Linux 进行远程开发

只要您的 Linux 虚拟机支持 SSH,它就可以托管在任何地方;您的本地主机、本地部署环境、Azure 或任何其他云中。您也可以在任何客户端上使用 - Windows、macOS 或 Linux。

注意:目前尚不支持 macOS 和 Windows SSH 主机。

在这篇博客文章中,我们将使用 Windows 客户端并连接到 Azure 上的 Linux 虚拟机。

入门

要开始使用,您需要完成以下操作

  1. 安装一个与 OpenSSH 兼容的 SSH 客户端(不支持 PuTTY)。
  2. 安装Visual Studio Code
  3. 拥有 Azure 订阅(如果您没有 Azure 订阅,请在开始之前创建免费帐户)。

创建虚拟机

如果您没有现有的 Linux 虚拟机,可以通过Azure 门户创建一个新的虚拟机。在 Azure 门户中,搜索“虚拟机”,然后选择添加。在那里,您可以选择您的 Azure 订阅,如果还没有资源组,可以创建一个新的资源组。

Create a virtual machine

现在您可以指定虚拟机的详细信息,例如名称、大小和基本映像。我们将在此示例中选择 Ubuntu Server 18.04 LTS,但您可以选择其他 Linux 发行版的最新版本,并查看我们的支持的 SSH 服务器

Virtual machine instance details

设置 SSH

有几种虚拟机认证方法,包括 SSH 公钥/私钥对或用户名和密码。我们强烈建议使用基于密钥的认证,这样您每次连接时都不需要输入密码。如果您使用的是 Windows,并且已经使用 PuttyGen 创建了密钥,您可以重复使用它们

如果您没有 SSH 密钥对,请打开 bash shell 或命令行并输入

ssh-keygen -t ed25519

这将生成 SSH 密钥。在接下来的提示符下按 Enter 键,将密钥保存在默认位置。

ssh-keygen output

然后会提示您输入安全密码,但您可以留空。

将 SSH 密钥添加到您的虚拟机

在前面一步中,我们生成了 SSH 密钥对。我们将把公钥复制到 id_ed25519.pub 的内容,然后将其粘贴到我们的虚拟机设置中。您还需要允许您的虚拟机接受入站 SSH 流量。

Add SSH public key to VM

使用 Azure 虚拟机的一个很棒的功能是能够启用自动关机(因为说实话,我们都会忘记关闭虚拟机……)。如果您转到管理选项卡,可以设置每天关闭虚拟机的时间。

Virtual machine auto-shutdown

选择查看 + 创建,Azure 将为您部署虚拟机!

使用远程 - SSH 连接

现在我们已经介绍了如何创建 SSH 主机,接下来连接到它吧!

VS Code 远程 - SSH 扩展允许您直接在 VS Code 中使用 SSH 连接到远程计算机或虚拟机。如果您还没有安装远程 - SSH 扩展,可以在扩展视图(Ctrl + Shift + X)中搜索“remote ssh”。

Remote SSH extension

您会注意到状态栏左下角有一个指示器。这个指示器告诉您 VS Code 当前运行在什么上下文(本地或远程)。点击该指示器可以显示远程扩展命令列表。

Remote extension commands

选择 Remote-SSH: Connect to Host 命令,然后按照 user@hostname 格式输入您的虚拟机连接信息来连接到主机。

user 是您将 SSH 公钥添加到虚拟机时设置的用户名。对于 hostname,返回到Azure 门户,在您创建的虚拟机的概览面板中,复制公共 IP 地址

Virtual machine public IP address

在连接信息文本框中设置用户和主机名。

Set user and host name

VS Code 现在将打开一个新的窗口(实例)。然后您会看到通知,提示“VS Code Server”正在 SSH 主机上初始化。一旦 VS Code Server 安装在远程主机上,它就可以运行扩展并与您的本地 VS Code 实例通信。

Initializing VS Code Server

通过查看状态栏中的指示器,您就知道您已连接到您的虚拟机。现在它显示的是我们虚拟机的主机名!

SSH indicator in Status bar

远程 - SSH 扩展还在活动栏中添加了一个新图标,点击它可以打开 SSH 资源管理器。在这里,您可以配置您的 SSH 连接。例如,您可以保存最常连接的主机,并从这里访问它们,而无需输入用户和主机名。

Remote button on Activity bar

连接到 SSH 主机后,您可以与远程机器上的文件交互并打开文件夹。如果您打开集成终端,您会发现您正在一个 bash shell 中工作,即使您使用的是 Windows。等等,我们已经连接到虚拟机了?这太容易了。这就是重点。这些扩展让远程开发变得轻松、顺畅……嗯,一点都不觉得“远程”。😃

Checking uname in the terminal

您可以使用 bash shell 浏览虚拟机上的文件系统。使用 mkdir demo 创建一个新文件夹“demo”,然后通过文件 > 打开文件夹浏览并打开远程主目录中的文件夹。

Remote open folder

您还可以在远程 SSH 主机上专门安装扩展。影响 UI 的扩展,如主题和代码片段,是安装在本地的,而其余扩展需要安装在远程 SSH 主机上。打开扩展视图时,您会注意到有两个部分,一个用于本地机器上的扩展,另一个用于远程主机上的扩展。即使您从不同的客户端通过 SSH 连接到远程机器,您的远程扩展和设置也将保持不变。当您安装扩展时,VS Code 会自动将其安装到正确的上下文。

Intellicode extension installed remotely

Hello World

让我们在虚拟机上部署一个基本的“Hello World” Python 应用。我们将使用一个流行的 Python Web 框架,名为 Flask。在您的 bash shell 中,运行以下命令。

sudo apt install python3-flask

在您之前创建的“Demo”文件夹中,创建一个新文件(Ctrl + N),命名为 app.py,包含一个基本的 Hello world Flask 应用。

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello Remote World! :)"

if __name__ == "__main__":
    app.run()

一旦 VS Code 将文件语言识别为 Python,如果远程机器上尚未安装 Microsoft Python 扩展,您会看到一条推荐通知。

Python extension recommendation

选择安装,重新加载 VS Code,然后您将开始在远程机器上看到 VS Code 的 IntelliSense 和语法高亮。

python IntelliSense

要运行应用程序,请按F5,并选择 Flask 调试配置。在 Python 调试控制台中,您会看到应用程序正在本地主机(localhost)的 5000 端口上运行。然而,localhost 当前指的是远程服务器,而不是您的本地机器。为了能够在您的本地机器上浏览该 Web 应用,我们将利用另一个功能,称为端口转发

为了能够访问远程机器上可能未公开暴露的端口,我们需要在本地机器上的一个端口和服务器之间建立连接或隧道。在应用程序仍然运行时,打开 SSH 资源管理器,找到已转发端口视图。点击转发端口链接,并指定我们要转发端口 5000。

Enter the port to forward

将连接命名为“browser”

Name the port

服务器现在将把 5000 端口的流量转发到我们的本地机器。当您浏览http://localhost:5000 时,您会看到正在运行的 Web 应用。

Hello Remote World in a browser

现在,真正的问题是……我们可以在远程机器上的 VS Code 中进行调试吗?是的!在应用程序仍然运行时,在返回字符串“Hello Remote World”的那一行设置一个断点,然后选择调试控件中的重新启动按钮。在您的浏览器中刷新页面,您就会命中断点!您将获得与本地相同的 VS Code 体验,包括编辑、调试以及您的所有设置和扩展。😊

Debugging over SSH

要切换回本地机器进行本地开发,请使用文件 > 关闭远程连接来关闭远程连接。

使用远程 - SSH 扩展,您可以在远程机器上使用 VS Code 的所有生产力功能和扩展来针对虚拟机进行工作。无论您的代码托管在哪里,您都能获得您熟悉和喜爱的完整的 VS Code 开发体验。

如果您想了解更多关于 VS Code Remote 的信息,可以阅读我们宣布远程开发的博客文章。您还可以试用其他远程扩展,开发容器WSL,并阅读我们的完整远程开发文档

祝您远程编程愉快,

Sana Ajani,VS Code 项目经理 @sana_ajani