webssh

article/2025/10/2 17:52:30

vue +django+linux实现webssh

技术栈

xterm.js:做到vue的表现型
websocket: 做vue和django之间的通信
paramiko: 建立SSH连接通道
ssh: 与linux进行连接
threading:多条数据返回前端,io密集型,用线程

  • 其中paramiko可以使用socket或pexpect实现。
    架构图

vue部分

xterm用3.1,4版本的简洁,但官方文档较少
加入xterm
在vue的package.json中加入xterm及版本
删除node_modules文件夹重新cnpm install(加入xterm支持)

main.js中导入
import ‘xterm/dist/xterm.css’

组件中

// 绑定terminal

加入

import { Terminal } from ‘xterm’
import * as attach from ‘xterm/lib/addons/attach/attach’
import * as fit from ‘xterm/lib/addons/fit/fit’
Terminal.applyAddon(attach) // 对黑窗口进行操作生效(回车等)
Terminal.applyAddon(fit) // 窗口自适应

加入钩子函数(对后台的一些状态的显示)

mounted () {
let terminalContainer = document.getElementById(‘terminal’)
this.term = new Terminal(this.terminal)
this.term.open(terminalContainer)
// open websocket
this.terminalSocket = new WebSocket(‘ws://127.0.0.1:8000/user/webssh/’)
this.terminalSocket.onopen = function(){
console.log(‘websocket is Connected…’)
}
this.terminalSocket.onclose = function(){
console.log(‘websocket is Closed…’)
}
this.terminalSocket.onerror = function(){
console.log(‘damn Websocket is broken!’)
}
this.term.attach(this.terminalSocket)
// 绑定xterm到ws流中
},
beforeDestroy () {
this.terminalSocket.close()
this.term.destroy()
}

django部分

import paramiko
#使django接口能接收到websocket
from dwebsocket import accept_websocket

做ssh连接对象

def _ssh(host,username,password,port=22):
sh = paramiko.SSHClient()
# 保存校验秘钥
sh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
sh.connect(host, username=username, password=password)
# linux 样式,可以改shell等
channle = sh.invoke_shell(term=‘xterm’)
return channle

后端向前端返回数据

def recv_ssh_msg(channle,ws):
‘’’
channle: 建立好的SSH连接通道
这个函数会不停的接收ssh通道返回的命令
返回到前端的ws套接字里
‘’’
while True:
if not channle.exit_status_ready():
buf = channle.recv(1024) # 接收命令的执行结果
ws.send(buf) # 向Websocket通道返回
else:
break
return

接口,实现与vue的连接

@accept_websocket
def webssh(request):
‘’’
1: 接收前端(ws)的命令,发给后台(ssh)
2: 接收后台的返回结果,给到前端
‘’’
if request.is_websocket:
channle = _ssh(‘Host’, username=, password=)
ws = request.websocket
t = threading.Thread(target=recv_ssh_msg,args=(channle,ws))
t.start() # 线程开启
while 1:
try:
cmd = ws.wait() # 阻塞接收前端发来的命令
if cmd:
channle.send(cmd) # 由SSH通道转交给Linux环境
else: # 连接断开 跳出循环
break
except:
break
ws.close() # 释放对应套接字资源
channle.close()
t.join()
print(‘已断开’)

做一个路由

path(‘webssh/’,webssh)

实现结果

webssh

技术要点

  • 这篇文章简单实现了webssh,其实是不标准的。作为实验操作,可以用docker的沙箱环境,出一些错误对主机不产生影响。
  • channle对象不可作为全局,全局的话相当于单例了,每个用户用的是同一个主机,当然不行。
  • 其中线程的操作要进行回收,回收不好的话第二次打开异常
  • 其中的websocket,paramiko都是双向连接的,while True实时发送消息
    • ws.wait()用来接收| ws.send()用来发送
    • channle.recv()用来接收|channle.send()用来发送
  • 若满足以下两条,说明完美实现
    • 测试命令:iostat -d 1 每秒返回一条消息
    • 刷新页面对操作没有影响,考验的是线程的操作

技术点评

  • 上面的操作和返回结果,都可以简单实现,回收机制做的很糙,可以优化;还有个问题,tcp在长时间不操作会自动断开,这个问题怎么解决?

    • 大家可以结合心跳包做些操作
  • webssh泛指一种技术可以在网页上实现一个SSH终端。从而无需Xshell之类的模拟终端工具进行SSH连接,将SSH这一比较低层的操作也从C/S架构扭成了B/S架构

    • 架构的转变,使我们更方便的管理远程主机,也是未来的一种趋势;也许未来不久的一天,我们可以实现无应用程序,一台设备,一个浏览器做全部事情,很期待!
  • 这样的架构常用在运维制作开发一些堡垒机等系统中,或是目前比较新型的在线教育方式,通过WebSSH向学生提供一个可以直接使用浏览器进行相关Linux操作或代码编写的学习方式

    • 对于在线linux体验有一下几种方式
      • https://www.tutorialspoint.com/unix_terminal_online.php
      • https://www.masswerk.at/jsuix/index.html
      • http://cb.vu/
      • https://copy.sh/v86/?profile=linux26
      • https://bellard.org/jslinux/
      • https://www.jdoodle.com/test-bash-shell-script-online/
      • https://paiza.io/en/projects/new?language=bash
      • https://www.shellcheck.net/#

更多内容尽在个人博客

yanachong.tech


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

相关文章

webSSH如何安装?如何使用?解决Web端远程连接终端~~运维篇

Hi~由于博主公司业务有相当多的Linux终端设备,每次连上设备需要使用到外部工具,如:Xshell,每次都得去输入IP,端口,账号,密码相当的繁琐;偶尔看到阿里云远程连接终端功能挺有意思的&a…

超强功能WebSSH安装,解决Web远程SSH终端

项目地址:https://github.com/huashengdun/webssh 一个简单的 Web 应用程序,用作 ssh 客户端以连接到您的 ssh 服务器。它是用 Python 编写的,基于 tornado、paramiko 和 xterm.js。 特征: 支持SSH密码认证,包括空密…

webssh —— 浏览器上的终端

需求 近期接到一个需求,实现一个运行在浏览器上的终端,用于快速连接到公司设备。 Tip:只求实现的可直接跳到 「最终方案」 处 。 需求有以下几点 1、设备都不在公网状态下 2、webshell 需要免密登陆 3、动态连接的端口、账号、密码 4、可显…

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为矩阵,则分别对每列进行处理,显示多组条形。…