使用 Visual Studio Code 进行远程 SSH

2019年7月25日,由Sana Ajani发布,@sana_ajani

远程 - SSH:简单、流畅且(像)本地

如果你错过了,Visual Studio Code 最近发布了 远程开发扩展。远程扩展允许你在使用 VS Code 作为开发环境时,针对容器、远程机器或虚拟机(VM)或 Windows Subsystem for Linux (WSL) 进行开发,同时享受其完整功能集。

远程SSH架构

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

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

然而,这种发展也伴随着其公平的挑战:

  • 如果您使用的是远程访问软件(如VNC),在编辑时可能会遇到延迟,因为您的用户界面不再是本地的。
  • 如果您使用的是远程桌面协议(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订阅,并创建一个新的资源组(如果您还没有一个)。

创建虚拟机

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

虚拟机实例详情

设置SSH

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

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

ssh-keygen -t ed25519

这将生成SSH密钥。在以下提示处按Enter键以将密钥保存在默认位置。

ssh-keygen 输出

然后,系统将提示您输入一个安全的密码短语,但您可以留空。

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

在上一步中,我们生成了一个SSH密钥对。我们将获取公钥并将其粘贴到我们的虚拟机设置中,通过复制id_ed25519.pub的内容。您还需要允许您的虚拟机接受入站SSH流量。

将SSH公钥添加到虚拟机

使用Azure虚拟机的一个很酷的功能是能够启用自动关机(因为让我们面对现实吧,我们都会忘记关闭我们的虚拟机…)。如果你转到管理标签,你可以设置每天想要关闭虚拟机的时间。

虚拟机自动关机

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

使用远程SSH连接

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

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

远程SSH扩展

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

远程扩展命令

选择Remote-SSH: Connect to Host命令,并通过以下格式输入您的虚拟机的连接信息来连接到主机:user@hostname

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

虚拟机公网IP地址

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

设置用户和主机名

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

初始化 VS Code 服务器

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

状态栏中的SSH指示器

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

活动栏上的远程按钮

一旦连接到SSH主机,您就可以与远程机器上的文件进行交互并打开文件夹。如果您打开集成终端,您会看到您在Windows上工作时正在使用bash shell。等一下,我们已经连接到我们的虚拟机了吗?这太容易了。这就是重点。这些扩展使远程开发感觉轻松、顺畅,而且……嗯,不像是远程的。😃

在终端中检查uname

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

远程打开文件夹

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

Intellicode扩展远程安装

你好,世界

让我们将一个基本的“Hello World”Python应用程序部署到我们的虚拟机。我们将使用一个名为Flask的流行Python网络框架。在您的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扩展推荐

选择安装,重新加载VS Code,您将开始在远程机器上看到VS Code的智能感知和颜色化功能。

python IntelliSense

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

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

输入要转发的端口

将连接命名为“browser”:

命名端口

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

浏览器中的Hello Remote World

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

通过SSH调试

要切换回本地机器进行本地开发,您可以通过文件 > 关闭远程连接来关闭远程连接。

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

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

远程编码愉快,

Sana Ajani, VS Code 项目经理 @sana_ajani