如何使用 xterm.js 创建基于 web 的终端以 ssh 进入本地网络上的系统

How to create web based terminal using xterm.js to ssh into a system on local network

我遇到了这个很棒的库 xterm.js,它也是 Visual Studio Code 终端的基础。我有一个非常笼统的问题。

我想通过基于 Web 的终端(不在网络中,可能在 aws 服务器上)访问本地网络上的机器(ssh 进入机器)。我能够在本地网络中成功执行此操作,但我无法得出从 Internet--> 本地网络执行此操作的结论。

举个例子 - An aws server running the application on ip 54.123.11.98 which has a GUI with a button to open terminal. I want to open terminal of a local machine which is in a local network somewhere behind some public ip on local ip 192.168.1.7.

是否可以使用某种解决方案来实现上述示例,我可以使用 xterm.js 这样我就不必去构建基于 Web 的终端?以这种方式公开终端时,我应该牢记哪些主要安全问题?

我在考虑在 AWS 和本地网络 ip 之间使用固定的中间服务器,并使用某种反向 ssh 隧道过程来执行此操作,但我不确定这是否是正确的方法或者是否可以更多 simple/better 实现此目的的方法。

我知道数字海洋,google 云,他们都这样做,但他们必须连接到具有 public ip 的计算机,而我在本地网络中有一台机器。我真的不想配置路由器来进行任何设置。

经过一些研究,这里是工作代码。

图书馆:

1) https://socket.io/

此库用于从客户端到服务器传输包。

2) https://github.com/staltz/xstream

这个库用于终端视图。

3) https://github.com/mscdex/ssh2

这是用于与远程服务器建立连接的主库。

第 1 步:将库 3 安装到您的项目文件夹中

第 2 步:从节点端开始为打开的套接字创建一个 server.js 文件

第 3 步: 连接客户端套接字到节点服务器(都在本地机器上)

棘手的逻辑是如何使用socket和ssh2。

在发送套接字时,您需要使用 ssh2 库触发 SSH 命令。在 ssh2 库(来自服务器)的响应中,您需要将套接字包传输到客户端。就是这样。

单击 here 查找示例。

该示例将包含这些文件和文件夹:

Type    Name
------------
FILE    server.js
FILE    package.json
FOLDER  src
FOLDER  xtream

首先您需要在 server.js 上配置您的服务器 IP、用户和密码或证书文件,只需 运行 node server.js.

P.S.: 别忘了运行 npm install

如果您有任何问题,请告诉我!

经过一番研究后,我发现了这项服务:https://tmate.io/ 完美地完成了这项工作。如果你需要一个基于 web 的 tmate 终端,你必须使用他们的 ssh 服务器作为反向代理,这在理想情况下我不太适应。然而,他们提供 tmate-server 可以用来托管你自己的反向代理服务器,但缺少 web UI。但是要构建一个系统,您必须在网络上通过 ssh 访问 NAT 后面的客户端,步骤如下。

  • 在某台云计算机上安装和配置tmate-server
  • 在客户端安装tmate并配置连接云机
  • 使用 xterm.js(由于基于 WebSocket 的通信很容易)创建一个 nodejs 应用程序,它连接到您的 tmate-server 并将命令传递给相应的客户端。 (注意公开此应用程序的安全问题,因为您将传递 Linux 命令)。
  • 根据您的用例,您可能需要在客户端对 tmate 客户端进行一个小包装,以自动或通过某些 UI/manual 操作 start/stop 它。

注意:我也在客户端为 start/stop 编写了一个小包装器,并将所需的信息传递给 API 服务器(用 nodejs 编写),然后将信息传递给另一个 API 将浏览器连接到相应的客户端会话。由于我们编写了这个应用程序,它包括身份验证以及终端上可以是 运行 的命令限制。你可以自定义很多。