如何使用 xterm.js 创建基于 Web 的终端以通过 ssh 连接到本地网络上的系统

Posted

技术标签:

【中文标题】如何使用 xterm.js 创建基于 Web 的终端以通过 ssh 连接到本地网络上的系统【英文标题】:How to create web based terminal using xterm.js to ssh into a system on local network 【发布时间】:2018-02-06 01:08:01 【问题描述】:

我遇到了这个很棒的库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 隧道过程来执行此操作,但我不确定这是否是正确的方法或者是否有更简单的方法/更好的方法来实现这一点。

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

【问题讨论】:

【参考方案1】:

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

图书馆:

1)https://socket.io/

该库用于从客户端向服务器传输包。

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

这个库用于终端视图。

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

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

第 1 步:将 Library 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

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

【讨论】:

感谢 Ankit,提供了这么多帮助(流程的第一部分真的很有帮助)。我也会尽快测试代码并让你知道。很快就会接受答案 当然..如果您有任何问题或疑问,请告诉我。很高兴能帮助你。谢谢 谢谢@Ankitvadariya。在进行了一些更改后,代码运行良好。如果您有 1)- NAT 后面的许多 linux 客户端(没有公共 IP)2)- aws 服务器 3)- 客户端想要让服务器访问它,您能否描述一下您将如何处理同样的事情终端由于客户端在 NAT 之后,服务器不能直接 ssh 到它。我认为我们可以使用客户端 ssh 进入服务器并使用反向 ssh 隧道来获取客户端访问权限,但是该过程的流程是什么以及它是如何工作的。是否可以通过修改上面的代码来做到这一点? @kartik 是的,您可以这样做。您必须在全局通道的私有通道中触发套接字包。 ssh2 几乎支持的东西。 github.com/mscdex/ssh2你只需要实现这样的棘手逻辑! @Ankitvadariya 你能解释一下吗,我没有任何节点经验。如果你能指出文档就好了【参考方案2】:

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

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

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

【讨论】:

以上是关于如何使用 xterm.js 创建基于 Web 的终端以通过 ssh 连接到本地网络上的系统的主要内容,如果未能解决你的问题,请参考以下文章

xterm.js 基于websocket 链接容器 命令行工具

webssh-xterm.js的简单使用

如何让 xterm.js 接受输入?

如何优化OpenSumi终端性能?

受祝福的服务器(Node.js)通过 websocket 到浏览器中的 Xterm.js 客户端

xterm.js结合WebSocket 实现前端虚拟终端