配置VSCode Remote Development
1、Ubuntu 上启用 SSH
(1)打开终端,并且安装openssh-server软件包:
sudo apt update
sudo apt install openssh-server
当被提示时,输入你的密码并且按 Enter,继续安装。
(2)安装完成后,SSH 服务将会被自动启动。你可以验证 SSH 是否正在运行,输入:
sudo systemctl status ssh
输出将会告诉你服务正在运行,并且启用开机启动:
注意,Ubuntu 自带一个配置防火墙配置工具,称为 UFW。如果防火墙在你的系统上被启用,请确保打开了 SSH 端口:
sudo ufw allow ssh
2、在VSCode上安装Remote - SSH插件
在Windows系统下,打开cmd,输入ssh,查看是否安装,如下图所示(表示已经安装过了),如果没有找到命令,可以登录GitHub下载win版本OpenSSH安装包,记得将路径加入系统环境变量哟~
打开VSCode,在扩展程序中搜索remote-ssh,搜索结果的第一个插件就是的,点击安装即可。
点击左下角的图标,可以连接Linux服务器。
按提示输入登录命令和密码即可。
ssh 远程主机用户名@远程主机ip
例如 ssh mjn@192.168.10.131
3、设置免密登录
(1)打开cmd生成密钥
ssh-keygen -t rsa
然后点击回车即可,记住,括号里面出现的路径就是密钥存放的路径
如果已经存在密钥了,会提示Overwrite (y/n)? 已经存在就不用覆盖掉原来的了。
(2)打开密钥存放的路径,将箭头指向的这个文件传输到Linux中/home/mjn/.ssh下面
(3)修改.ssh目录权限为700
chmod 700 .ssh
(4)把公钥内容追加到authorized_keys文件中,并将权限修改为600
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
(5)重启sshd
systemctl restart sshd.service
4、远程连接效果
可以选择目录在左侧导航栏进行展示
此时,终端处显示的已经是Linux系统中的目录结构了。
注:在设置免密登录的第5小步重启sshd中,笔者在输入sshd.service时使用自动补全,但就是补不全hh~,我以为是没有这个文件,所以搜索了其他博客,发现要启动sshd服务,相关指令如下:
启动sshd服务
systemctl start sshd.service
检查sshd服务状态
systemctl status sshd.service
关闭sshd服务
systemctl stop sshd.service
可能补不全的时候,自己手动输入 sshd.service 也可以执行,但是我当时下意识感觉缺这个文件hh~
下面我们将VS Code Remote Development 项目作为用例进行需求分析和逆向工程。
需求分析
首先,我们需要确定该软件的主要目标用户和使用场景。VS Code 是一个轻量级的源代码编辑器,它的目标用户是开发人员。Remote Development 功能则是为那些需要在远程计算机上进行开发的用户提供便利,使得开发人员可以在自己的本地计算机上使用 VS Code 来开发、测试和调试远程服务器上的应用程序。
接下来,我们可以通过阅读相关文档和代码库来确定 Remote Development 功能的主要特点和用例。例如,可以从以下几个方面进行分析:
- 连接方式:用户可以选择 SSH 或者 Container 这两种方式来连接到远程计算机。
- 开发环境:VS Code 支持在远程计算机上安装各种运行时和扩展,并且可以通过设置端口转发等方式进行访问。
- 文件同步:VS Code 可以通过 sshfs、rsync 等工具在本地计算机和远程服务器之间同步文件。
- 调试支持:VS Code 支持在远程服务器上进行调试,并且可以通过端口转发等方式进行调试。
- 安全性:VS Code 使用 SSH 隧道进行数据传输,并且支持通过密钥进行身份验证,保证数据传输的安全性。
通过对以上特点和用例的分析,我们可以进一步确定 Remote Development 功能的需求和设计。例如,需要支持多种连接方式、提供方便的文件同步和调试功能、确保数据传输的安全等。
用户需求
用户想要在本地使用 VS Code 的编辑器功能,但是由于各种原因(如开发环境需要特定的配置)无法在本地安装所需的软件或插件。因此,用户需要一种远程编辑器的解决方案,使其能够在本地使用 VS Code 的完整功能,并与远程服务器上的文件系统交互。
功能需求
VS Code Remote Development 解决方案应该具备以下主要功能:
- 允许用户通过 SSH、容器或 Windows 子系统连接到远程主机。
- 在本地打开远程文件夹并在本地 VS Code 编辑器中进行编辑。
- 提供本地和远程之间的文件同步和自动更新机制。
- 允许本地扩展在远程主机上运行。
- 允许开发人员在远程主机上运行任务和调试会话。
- 支持多个远程连接和快速切换。
性能需求
- 实现低延迟的远程编辑体验。
- 在多种网络环境下提供稳定的连接和操作性能。
- 对 CPU 和内存资源的占用要求较低。
安全需求
- 保护用户的身份验证信息和连接安全。
- 防止对远程主机进行未授权的访问或更改。
逆向工程
为了更好地理解 Remote Development 功能是如何实现的,我们可以进行逆向工程,即对代码库进行分析,以确定其实现细节。
在查看代码前,我们可以先了解 VS Code 的插件开发机制和插件架构。VS Code 使用 Electron 作为底层框架,并使用 TypeScript 进行开发。其中,插件可以访问 VS Code API 来扩展编辑器的功能。
接下来,我们可以阅读 Remote Development 插件的源代码并进行分析。Remote Development 插件包括客户端和服务器端两部分。客户端负责与用户交互,并将请求发送到远程服务器。服务器端则负责处理请求,并返回结果给客户端。
在客户端的实现中,我们可以看到 Remote Development 插件使用了 Visual Studio Code 中提供的 Terminal API 来创建终端窗口,通过 SSH 隧道将本地计算机的端口转发到远程计算机上,并使用 sshfs 和 rsync 等工具进行文件同步。此外,客户端还支持在远程服务器上进行远程调试。对于容器方式的连接,插件使用了 Docker API 来管理容器。
在服务器端的实现中,Remote Development 插件实现了一个名为 "vscode-remote-server" 的 Node.js 应用程序。该应用程序监听客户端发来的请求,并在收到请求后启动远程开发环境。同时,服务器端还支持通过 SSH 隧道将本地计算机的端口转发到远程计算机上。
通过逆向工程的分析,我们可以更深入地了解 Remote Development 功能的实现细节,并且在开发和调试过程中更加得心应手。
VS Code Remote Development 的实现方法可以从其 GitHub 上的源代码库中获得。该项目使用 TypeScript 和 Node.js 编写,下面是一些重要的类和函数:
- remoteExplorer.ts:remoteExplorer.ts 提供了与远程资源管理器相关的类和函数。其中最重要的类是 RemoteFileService 和 RemoteFileSystemProvider,它们分别处理文件服务和文件系统提供程序的功能。
- tunnelModel.ts:tunnelModel.ts 定义了一个名为 TunnelModel 的类,它处理 SSH 隧道的创建和关闭。该类依赖于 sshHelper.ts 中提供的 SSH 命令行帮助程序。
- environmentService.ts:environmentService.ts 提供了用于获取和设置 VS Code 环境变量的方法。该模块还包含 DataprotocolServer 类,该类充当数据协议服务器并接受来自客户端的请求和响应。
- extensionHostProcessManager.ts:extensionHostProcessManager.ts 管理远程扩展主机进程的生命周期。在用户打开远程文件夹时,该组件会运行并启动扩展插件进程,在本地 VS Code 编辑器中显示远程扩展插件。
- terminalServer.ts:terminalServer.ts 实现了终端服务器,允许用户通过 SSH 连接到远程主机的终端。TerminalProcess 类管理 SSH 进程和 shell 进程。
- remoteAgentConnection.ts:remoteAgentConnection.ts 定义了 RemoteAgentConnection 类,该类充当与远程 VS Code 编辑器的通信管道。它使用 MessagePipe 协议在本地计算机和远程主机之间传递信息。
通过以上的需求分析和逆向工程,我们可以更好地理解 VS Code Remote Development 解决方案的实现原理。VS Code Remote Development 提供了一种优秀的解决方案,使得用户能够在本地计算机上享受完整的编辑器功能,并与远程服务器进行交互。同时,最大限度地保证了性能、安全和可靠性。
需求分析和逆向工程是软件开发中非常重要的两个环节。通过需求分析,我们可以确定软件的主要功能、用户需求和设计方案等,从而保证软件满足用户期望。