webssh —— 浏览器上的终端

article/2025/10/2 17:41:39

需求

近期接到一个需求,实现一个运行在浏览器上的终端,用于快速连接到公司设备。

Tip:只求实现的可直接跳到 「最终方案」 处 。

需求有以下几点

1、设备都不在公网状态下
2、webshell 需要免密登陆
3、动态连接的端口、账号、密码
4、可显示当前设备信息

使用 mac 的同学应该会更加熟悉,使用 windows 的同学可以把它理解为 power shell 或者理解为 vscode 的终端。

综合以上几点梳理出几点实现的要求

1、设备不在公网状态下。说明没有公网 ip,不能 ssh 直连,需要跳板机
2、免密登陆、动态端口、显示信息。说明需要灵活可定制的工具

初步方案

应用 ➡️ webshell ➡️ 跳板机 ➡️ 设备

调研

如果买过服务器倒腾的同学应该都用过云服务商提供的 webshell 终端,用来免密、快速的连接自己的服务器。所以首先查看了阿里云、腾讯云等大场的云服务器的登陆终端,以求找到蛛丝马迹。

一、F12

使用前端传统艺能,打开控制面板,查看大厂 webshell 的 element、js 的引入包,找到了一个出现频率最高的 js 包 xterm.js

二、顺藤摸瓜

查看 xtermjs 的 github 项目。Fork 数 1.3k,Start 数 13.2k。这是一个 webshell 的核心包,依赖此包开发的项目只是展示出来的就有 100 个左右。其中有很多明星项目,只是拿一个项目就能显示出这个库的重要性 「Microsoft Visual Studio Code」(VsCode) 的终端就是以这个库为核心进行开发的。

三、找个保熟的瓜

以上的信息说明核心项目找到了,需要找一个符合目前需求的衍生项目。在众多的衍生项目中确定目标 WebSSH2

理由如下

1、Start 1.7k。 说明这个库的使用者不少,搜索了一下有一定量的参考文章
2、近期有更新。说明这个库还是一直在维护的
3、根据 README.md 初步运行项目基本符合需求
4、使用 Express + Socket + ssh2 + xtermjs 代码复杂度低,方便个人定制和部署

以上几点完全满足我接到的需求,也非常适合定制界面和添加业务逻辑。

开源项目的一些问题

1、明文传输

连接后的 ssh 域名、端口、账号、密码都是暴露在界面上的并不安全,url 动态传参也是使用的明文传输,这就直接造成关键信息的泄漏,需要进行传参加密、页面显示的优化。

2、初始化参数问题

https://github.com/billchurch/webssh2/blob/main/app/server/app.js 路径下的方法

// app.js
setDefaultCredentials(config);// util.js
// 这个方法的传参为用户信息的初始化
exports.setDefaultCredentials = function setDefaultCredentials({name: username,password,privatekey,overridebasic,
}) {defaultCredentials = { username, password, privatekey, overridebasic };
};// config 中的用户信息在 user 对象中,所以传参 config 时的数据初始化是错误的,应改为
setDefaultCredentials(config.user);

以上方法在你选择使用默认用户名密码的形式免密登陆时会用到

3、终端行列问题
初始化时终端的行数及列数的函数未触发,导致在宽屏状态下的终端大小为初始状态而没有自适应为宽屏状态。导致输入较长参数时出现未自动切换下一行并且重复覆盖该行的参数

在这里插入图片描述

终端行列问题

源代码触发 resizeScreen 位置在

// app/client/src/js/index.ts
socket.on('header', (data: string) => {if (data) {header.innerHTML = data;header.style.display = 'block';// header is 19px and footer is 19px, recaculate new terminal-container and resizeterminalContainer.style.height = 'calc(100% - 38px)';resizeScreen();}
});

socket 中触发事件位置在下图第一步, ssh 初始化终端的行列时在第二步,而真正被触发并设置终端的事件在 conn.shell 事件中,也就是说虽然以设置 header 的事件去触发 resizeScreen 的事件,但 ssh 初始化终端并未开始,所以第三步的 socket.on(‘resize’) 事件并未被触发。

我们需要在下图第二步初始化以后的事件中去触发 resizeScreen 事件,这样才能真正生效。

在这里插入图片描述

在触发 resizeScreen 方法时,shell 方法可能还未执行,导致 resizeScreen 失败。

解决方法

// 在 conn.shell() 的方法中去触发 socket.on('resize') 事件
// app/client/src/js/index.ts 中的 socket.on('data') 事件在 conn.shell() 中
let dataResize = true;// 在 client 中将触发方法放置在 data 事件中,且只在初始化时触发一次
socket.on('data', (data: string | Uint8Array) => {console.log('socket-on-data', data);// FIX:  Solve the problem that “resizeScreen” does not take effectif (dataResize) {console.log('dataResize');dataResize = false;resizeScreen();}term.write(data);if (sessionLogEnable) {sessionLog += data;}
});

最终方案及实现

webssh2 + 跳板机

如果是基本需求的话,根据项目文档进行基本部署就可以通过 iframe 嵌套到网页中即可

我做的一些定制

1、页面优化。关键信息隐藏
2、动态传参
3、参数加密

文章来自公众号 前端学海


http://chatgpt.dhexx.cn/article/ipbR1DFt.shtml

相关文章

webssh的安装与使用

最近研究了一下在web端实现一个远程连接终端操作的类似网页版xshell的实现。在网上搜索了一下发现已经有类似的操作在这里主要介绍以下两种。 https://github.com/huashengdun/websshhttps://github.com/billchurch/WebSSH2 我用的是虚拟机centos7系统,别的linux系…

简单分析实现运维利器---webssh终端

背景 现在几乎所有东西都向往着自动化,在运维界更是如此,运维人员都向往自动化代替人工操作、解决人工操作大量重复性工作的问题、故障主动恢复:及时发现;流程;解决。运维规范化:角色定义和责任划分、流程化等。但这些种种的目的,都离不开非常细小的技术支持,下面我们…

WebsocketWebSSH

什么是WebSSH? webssh 泛指一种技术可以在网页上实现一个 SSH 终端ssh终端:用来通过ssh协议,连接服务器进行管理运维开发方向:堡垒机登录、线上机器管理(因为运维人员不可能24小时携带电脑)在线编程:提供…

WebSSH神器sshwifty的安装与使用

本文章最初发表在XJHui’s Blog,未经允许,任何人禁止转载! 为使您获得最好的阅读体验,强烈建议您点击 这里 前往 XJHui’s Blog 查看! WebSSH工具 初衷 9.9买的一年服务器,不用实属可惜由于是计算机专业…

Sql Server查看表结构

1、表结构 2、通过 t abc 查询出的表结构 3、存储过程 t CREATE proc t TableName nvarchar(200) as SELECT (select top 1 isnull(value,) from sys.extended_properties ex_p where…

sql 查看表结构改动的记录

系统更新迭代比较大的情况,可能改动了比较多的数据库,留个笔记。。 select * from sys.objects order by modify_date desc 这句是查看数据库表的改动,希望对自己有帮助 -20180613

Access、SQLServer以及SQLite如何查询数据表结构

日期:2021年11月05日 作者:Commas 注释:整理了一下不同数据库如何获取数据表结构,比较有意思的玩法就是将不同数据库进行相互转换,由于篇幅问题,暂且仅讨论"数据表结构"的获取…… 目录 文章目录…

sqlServer 查看表结构(字段类型) (更新中)

对MySQL和Oracle熟悉的朋友知道用desc就可以查询一张表的结构,但是在SQL Server里执行desc命令会报错。 现提供两条命令查询表结构: 1.sp_help table_name; 2.sp_columns table_name; sp_help 直通车报表上周宝贝$; sp_columns 直通车报表…

用SQL语句查看Oracle数据表的结构信息

文章目录 获取所有表的列表查看表结构查看某表的注释查看某表的字段注释 获取所有表的列表 相知道相应用户下有哪些表,可以通过以下 SQL 语句进行查询 select table_name from user_tables; //当前用户的表 select table_name from all_tables; //所有用户…

使用SQL语句修改表结构(SQL Server)

使用SQL语句修改表结构(SQL Server) 文章目录 使用SQL语句修改表结构(SQL Server)ALTER TABLE的语法格式如下:添加列删除列修改表的列数据类型和名称 ALTER TABLE的语法格式如下: 上述格式主要参数说明如下…

sql查看mysql表结构_MySQL 查看表结构简单命令

一、简单描述表结构,字段类型 desc tabl_name; 显示表结构,字段类型,主键,是否为空等属性,但不显示外键。 例如:desc table_name 二、查询表中列的注释信息 select * from information_schema.columns where table_schema = db #表所在数据库 and table_name = tablename…

sqlserver数据库如何快速查看表结构sql

有时候,我们熟悉一个新系统,首先就需要熟悉其数据库的各个表结构。这时候,其实我们可以通过一个SQL清晰的查看表结构。 SQL如下: SELECT CASEWHENcol.colorder 1 THENobj.name ELSE END AS 表名,col.colorder AS 序号 ,col.na…

SQL语句查询表结构

代码如下: SELECT表名 Case When A.colorder1 Then D.name Else End,表说明 Case When A.colorder1 Then isnull(F.value,) Else End,字段序号 A.colorder,字段名 A.name,字段说明 isnull(G.[value],),标识 Case When COLUMNPROPE…

SQL语句获取表结构

目录 语句演示千人全栈VIP答疑群联系博主帮忙解决报错 语句 获取表的结构数据,如表名,数据类型,精度等数据,代码如下: SELECT t.table_name, -- 表名c.column_name, -- 字段名c.data_type, -- 字段类型c.numeric_pre…

matlab 频数分布直方图_matlab 统计直方图

展开全部 1、首先随机产生一组数据作为例子,在这里,我们32313133353236313431303231363533e4b893e5b19e31333431363566随机产生一组数据,并将其圆整为整数,方法是:around(10*rand(5,1)) 2、接下来,可以用MA…

关于MATLAB直方图的绘制及应用

关于MATLAB 直方图 整理记录histogram2 —三维直方图的一些用法及拓展应用 散点绘制直方图 h histogram2(Xe,Ye,10,FaceColor,flat),title(Entries),xlabel(Xe),ylabel(Ye),colorbar,grid onXe Ye,均为列向量;10 ,bin number; …

Matlab画直方图

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 %% 绘制统计直方图 %hist(y):如果y是向量,则把其中元素放入10个条目中,且返回每条中的元素的个数;如果y为矩阵,则分别对每列进行处理,显示多组条形。…

MATLAB柱状图(数据可视化)

示例 A[60.689;87.714;143.1;267.9515];C[127.5;160.4;231.9;400.2] BC-A; D[A,B,C]; bar1bar([2:5:17],A,BarWidth,0.2,FaceColor,k); hold on; bar2bar([3:5:18],B,BarWidth,0.2,FaceColor,[0.5 0.5 0.5]); hold on; bar3bar([4:5:19],C,BarWidth,0.2,FaceColor,w);ylabel(耗…

matlab 柱状图不同颜色(取巧哈)

以前写过一个颜色索引的柱状图,但是年代久远想不起来了。 今天需要出一个不同颜色的柱状图,看了一下博客,首先使用了matlab中的children,但是发现颜色没有变化。 后来从另外的博客中发现,matalb2014以后的版本这个功能…

Matlab柱状图 不同颜色

实现柱状图正负颜色不同,增加小刻度线 clear clcdata xlsread(ecof(zcm).xls);hold on for i 1 : length(data)if data(i,1)> 0bar(data(i,2),data(i,1),0.5,b) % 正数用蓝色elsebar(data(i,2),data(i,1),0.5,k) % 负数用黑色end end % set(gca,Fontname, Ti…