现已可用!了解 11 月的新功能和修复。

使用 Visual Studio Code 进行远程 SSH

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

Remote - SSH:简单、流畅,如本地般(轻松)

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

Remote SSH architecture

无限:你不受限于你的本地机器

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

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

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

如果不放弃你的工具,能够摆脱本地机器的物理限制,那岂不是很棒。现在,Remote - 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 将为你部署虚拟机!

使用 Remote - SSH 连接

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

VS Code Remote - SSH 扩展允许你使用 SSH 从 VS Code 内部连接到远程计算机或虚拟机。如果你尚未安装 Remote - SSH 扩展,你可以在“扩展”视图中搜索“remote ssh”(Ctrl + Shift + X)。

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

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

Remote button on Activity bar

连接到你的 SSH 主机后,你可以与远程计算机上的文件交互并打开文件夹。如果你打开集成终端,你将看到你正在 在 Windows 上 工作时在 bash shell 中工作。等等,我们已经连接到我们的虚拟机了?这太容易了。这就是重点。这些扩展使远程开发感觉简单、流畅,而且……好吧,不是远程的。😃

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”Python 应用程序部署到我们的虚拟机。我们将使用一个流行的 Python Web 框架,称为 Flask。在你的 bash shell 中,运行以下命令。

sudo apt install python3-flask

在你之前创建的“Demo”文件夹中,创建一个名为 app.py 的新文件 (Ctrl + N),其中包含一个基本的 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 调试控制台中,你将看到该应用程序正在本地主机上的端口 5000 上运行。但是,localhost 当前指的是远程服务器,而不是你的本地计算机。为了能够在本地计算机上浏览到 Web 应用程序,我们将利用另一个称为端口转发的功能。

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

Enter the port to forward

将连接命名为“browser”。

Name the port

服务器现在会将端口 5000 上的流量转发到我们的本地计算机。当您浏览到 https://127.0.0.1:5000 时,您会看到正在运行的 Web 应用程序。

Hello Remote World in a browser

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

Debugging over SSH

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

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

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

祝您远程编码愉快,

Sana Ajani,VS Code 项目经理 @sana_ajani