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