如何使用 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 链接容器 命令行工具