使用 Visual Studio Code 进行远程 SSH
2019 年 7 月 25 日,作者 Sana Ajani,@sana_ajani
远程 - SSH:轻松、顺畅、(如同)本地体验
如果您还没有听说,Visual Studio Code 最近发布了远程开发扩展。通过远程扩展,您可以使用 VS Code 及其完整的功能集作为开发环境,针对容器、远程计算机或虚拟机 (VM),或者适用于 Linux 的 Windows 子系统 (WSL) 进行开发。
无限可能:您不受本地机器的束缚
越来越多的开发者从事大型复杂项目,这些项目需要他们在专业的开发虚拟机或服务器上工作,这些虚拟机或服务器比普通笔记本电脑提供更多的存储或计算能力。
然而,这种开发方式也带来了一些挑战
- 如果您使用远程访问软件(如 VNC),编辑时可能会遇到延迟,因为您的 UI 不再是本地的。
- 如果您使用远程桌面协议 (RDP),管理多个连接可能会很困难。
- 挂载远程文件系统和执行批量操作可能很慢。
- 保持远程和本地环境同步很麻烦,而且您经常会遇到在某个地方能工作但在另一处却不行的问题。
- 使用 SSH 和 Vim 远程编辑文件意味着您无法在您惯用的代码编辑器中获得舒适体验。
如果能够摆脱本地机器的物理限制,同时又不放弃您的工具,岂不是太棒了。现在,远程 - SSH 扩展的魔力就来了。
使用 Linux 进行远程开发
只要您的 Linux 虚拟机支持 SSH,它就可以托管在任何地方;您的本地主机、本地部署环境、Azure 或任何其他云中。您也可以在任何客户端上使用 - Windows、macOS 或 Linux。
注意:目前尚不支持 macOS 和 Windows SSH 主机。
在这篇博客文章中,我们将使用 Windows 客户端并连接到 Azure 上的 Linux 虚拟机。
入门
要开始使用,您需要完成以下操作
- 安装一个与 OpenSSH 兼容的 SSH 客户端(不支持 PuTTY)。
- 安装Visual Studio Code。
- 拥有 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 密钥添加到您的虚拟机
在前面一步中,我们生成了 SSH 密钥对。我们将把公钥复制到 id_ed25519.pub 的内容,然后将其粘贴到我们的虚拟机设置中。您还需要允许您的虚拟机接受入站 SSH 流量。
使用 Azure 虚拟机的一个很棒的功能是能够启用自动关机(因为说实话,我们都会忘记关闭虚拟机……)。如果您转到管理选项卡,可以设置每天关闭虚拟机的时间。
选择查看 + 创建,Azure 将为您部署虚拟机!
使用远程 - SSH 连接
现在我们已经介绍了如何创建 SSH 主机,接下来连接到它吧!
VS Code 远程 - SSH 扩展允许您直接在 VS Code 中使用 SSH 连接到远程计算机或虚拟机。如果您还没有安装远程 - SSH 扩展,可以在扩展视图(Ctrl + Shift + X)中搜索“remote ssh”。
您会注意到状态栏左下角有一个指示器。这个指示器告诉您 VS Code 当前运行在什么上下文(本地或远程)。点击该指示器可以显示远程扩展命令列表。
选择 Remote-SSH: Connect to Host 命令,然后按照 user@hostname
格式输入您的虚拟机连接信息来连接到主机。
user
是您将 SSH 公钥添加到虚拟机时设置的用户名。对于 hostname
,返回到Azure 门户,在您创建的虚拟机的概览面板中,复制公共 IP 地址。
在连接信息文本框中设置用户和主机名。
VS Code 现在将打开一个新的窗口(实例)。然后您会看到通知,提示“VS Code Server”正在 SSH 主机上初始化。一旦 VS Code Server 安装在远程主机上,它就可以运行扩展并与您的本地 VS Code 实例通信。
通过查看状态栏中的指示器,您就知道您已连接到您的虚拟机。现在它显示的是我们虚拟机的主机名!
远程 - SSH 扩展还在活动栏中添加了一个新图标,点击它可以打开 SSH 资源管理器。在这里,您可以配置您的 SSH 连接。例如,您可以保存最常连接的主机,并从这里访问它们,而无需输入用户和主机名。
连接到 SSH 主机后,您可以与远程机器上的文件交互并打开文件夹。如果您打开集成终端,您会发现您正在一个 bash shell 中工作,即使您使用的是 Windows。等等,我们已经连接到虚拟机了?这太容易了。这就是重点。这些扩展让远程开发变得轻松、顺畅……嗯,一点都不觉得“远程”。😃
您可以使用 bash shell 浏览虚拟机上的文件系统。使用 mkdir demo
创建一个新文件夹“demo”,然后通过文件 > 打开文件夹浏览并打开远程主目录中的文件夹。
您还可以在远程 SSH 主机上专门安装扩展。影响 UI 的扩展,如主题和代码片段,是安装在本地的,而其余扩展需要安装在远程 SSH 主机上。打开扩展视图时,您会注意到有两个部分,一个用于本地机器上的扩展,另一个用于远程主机上的扩展。即使您从不同的客户端通过 SSH 连接到远程机器,您的远程扩展和设置也将保持不变。当您安装扩展时,VS Code 会自动将其安装到正确的上下文。
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 扩展,您会看到一条推荐通知。
选择安装,重新加载 VS Code,然后您将开始在远程机器上看到 VS Code 的 IntelliSense 和语法高亮。
要运行应用程序,请按F5,并选择 Flask 调试配置。在 Python 调试控制台中,您会看到应用程序正在本地主机(localhost)的 5000 端口上运行。然而,localhost 当前指的是远程服务器,而不是您的本地机器。为了能够在您的本地机器上浏览该 Web 应用,我们将利用另一个功能,称为端口转发。
为了能够访问远程机器上可能未公开暴露的端口,我们需要在本地机器上的一个端口和服务器之间建立连接或隧道。在应用程序仍然运行时,打开 SSH 资源管理器,找到已转发端口视图。点击转发端口链接,并指定我们要转发端口 5000。
将连接命名为“browser”
服务器现在将把 5000 端口的流量转发到我们的本地机器。当您浏览http://localhost:5000 时,您会看到正在运行的 Web 应用。
现在,真正的问题是……我们可以在远程机器上的 VS Code 中进行调试吗?是的!在应用程序仍然运行时,在返回字符串“Hello Remote World”的那一行设置一个断点,然后选择调试控件中的重新启动按钮。在您的浏览器中刷新页面,您就会命中断点!您将获得与本地相同的 VS Code 体验,包括编辑、调试以及您的所有设置和扩展。😊
要切换回本地机器进行本地开发,请使用文件 > 关闭远程连接来关闭远程连接。
使用远程 - SSH 扩展,您可以在远程机器上使用 VS Code 的所有生产力功能和扩展来针对虚拟机进行工作。无论您的代码托管在哪里,您都能获得您熟悉和喜爱的完整的 VS Code 开发体验。
如果您想了解更多关于 VS Code Remote 的信息,可以阅读我们宣布远程开发的博客文章。您还可以试用其他远程扩展,开发容器和WSL,并阅读我们的完整远程开发文档。
祝您远程编程愉快,
Sana Ajani,VS Code 项目经理 @sana_ajani