【webssh】网页上的SSH终端

【webssh】

  ——记两天来比较痛苦的历程

  广义上来说,webssh泛指一种技术可以在网页上实现一个SSH终端。从而无需Xshell之类的模拟终端工具进行SSH连接,将SSH这一比较低层的操作也从C/S架构扭成了B/S架构。

  能实现webssh的组件有好几种,但归根结底都是建立在客户端和服务端的即时通信上,有一些webssh只停留在这一层,表明客户端接入的ssh界面只是服务端本身的后台;另一种稍微高级一点的,将webssh做成一个通用的服务,网页上的ssh界面其实就和XShell一样,可以连接任何服务器可以连通的机器。由于一般服务器都会安装有ssh客户端软件,所以两者之间硬要说有很明显的区别其实也没有。

  下面来说一说我的需求吧,我做的一个资源管理系统中重要的一部分就是服务器。同时系统中也维护了各个服务器的用户和密码,那么如果在页面上按一个键,就能打开一个webssh,并且 自动登录 ,这样就能很方便地管理各个服务器了。

  基于这样一种需求的想法,我出发去找了一些项目,下面来说说几个找到的可能有用的:

■  GateOne

  项目地址: https://github.com/liftoff/GateOne

  详细的安装教程可以参考这篇:http://www.laozuo.org/10703.html

  这个东西被很多人称赞,使用了下也发现确实很牛。它是一个基于HTML5的webssh工程,不需要任何浏览器的任何插件就能无障碍运行。我感觉gateone最厉害的地方在于其强大的webssh界面。不仅仅是一块黑屏,它还支持多终端创建和切换,支持在终端中显示图片等内容,支持操作回放,日志审计等等功能。简直可以说比putty,XShell之类的桌面软件都要强大很多。但是その分,这个工程很大,需要的依赖很多。

  gateone的开发框架是tornado,刚好是python的,所以我看了它很长时间。。在保证有了tornado,paramiko等一系列依赖之后,下载来项目,可以考虑用python setup.py install来将gateone作为一个软件安装在服务器上,我采用的方法是python gateone.py这样的比较low的办法启动服务的。默认端口等等配置可以在gateone.py同目录下的server.conf中修改。哦对了,gateone默认使用了https协议,所以在访问的时候记得不要搞错了。

  部署完成之后,访问相关地址,可以看到gateone的界面。简单用了一下,界面的边上还有一连串工具栏,没有仔细研究,不过确实可以说是和桌面级软件一般的好用。

  不过gateone有个很大的缺点不符合我的需求,就是无法做到自动登录。gateone其实是作为一个通用的ssh客户端服务放在服务器上的,我无法在打开它的时候向其传递一些信息从而实现自动的ssh到某台服务器。为了自动登录,我甚至用jquery找到光标的DOM然后在它前面插入信息等方法,均告失败。粗粗看了下源码,觉得水平不足以改源码来实现。。于是放弃找其他办法

■  shellinabox

  这个项目也是一个很好的webssh,不过没有细看,因为它似乎只支持对于部署本地的访问,当然如果要访问出去也是可以,这样还是略显麻烦一点。而且自动登录的问题依然没有解决,我依然没有找到办法向webssh界面传递信息实现自动登录。

  在github上看似乎最新版本已经集合了很多其他插件比如IDE插件和其他一些美化界面的东西进去,看起来还是很漂亮的。

■  xterm.js

  晚上问了一下公司里有类似功能的项目是如何实现webssh的,结果被告知是使用了xterm.js,并且做这块的同事已经离职了。。只好自己研究了下xterm.js这个库。

  项目地址:https://github.com/xtermjs/xterm.js

  xterm.js是一个前端库,要实现一个完整的webssh还需要后端的支持。xterm的话可以认为它就是可以在前端画一个功能较为齐全的终端屏幕。

  哦对了,在跟着它的readme安装的时候还猜了不少坑,npm这个东西至今还是不太会用。前端的玩法有必要系统学一下。总之最后总算是搞出了xterm.js和xterm.css两个文件放到页面里实验了一下。确实画出了黑屏,不过没有交互啊。交互的话肯定要用websocket(其他双工交互方式肯定是效率不高的,简单用用可以,webssh传输强度比较大的东西还是算了),flask也就算了,django里的websocket基本不会。。无奈再回网上找找。

■  webssh

  项目地址: https://github.com/huashengdun/webssh

  最终找到了webssh(狭义)这个东西。其实同名的webssh之前我已经在github上找到一个,之前开运维技术大会时,听到别人的作品中也是用了那个组件。但是那里简介一看在一年前就已经不维护了,下来一试发现bug多得是,所以很快就放弃了。不过这次找到的webssh似乎和之前那个没啥关系,是同名的另一个项目。下来一试发现好得很,不仅能够实现基本的ssh界面,而且代码也不多,要自己改的话学习成本也不是很大。

  技术上,这个项目前端用的也是xterm.js,后端用的也是tornado,而且后端的目录结构相当简单易懂。部署上去之后访问进去一开始仍然是需要输入IP,端口,账号密码这些内容的界面。但是它明确写出了那个界面里用了哪些JS,于是我想到了可以在连接里加入GET参数,然后自建一个JS来把这些参数填入input中,然后再自动按一下submit,就可以实现自动登录了。

  这里不得不指出的是,webssh用的是http协议,安全方面上可能有一些不足。但是已经顾不得这么多了。。而且我把webssh部署在和我自己项目同一台服务器上,页面上采用了iframe访问webssh服务,所以相对好一点。

  至此我的需求基本实现了,不过还有点不足,就是我不想把webssh默认的那个带有表单的界面展示出来,于是用了layer组件,在页面加载开始时就调出了一个加载界面并且指定shade为true,使得看不到后面的内容。请求成功后关掉layer,如果请求失败,就以layer.msg的方式将错误信息展现。按照webssh的main.js中默认的提示错误的方式,是将错误信息写在一个#status的div中,记得把status.text(xxx)之类的内容换成layer.msg即可。还有一个歪打正着的,默认情况输入exit退出ssh之后会回到表单界面,加上layer之后退出来不显示表单而是变成一块黑屏,很好。

  其余一些定制就是很简单了。比如把错误提示信息换成中文等等。

  这个过程中还遇到过两个小问题。第一个是当我的ssh区域作为一个iframe出现在页面上时,如果区域高度过小,比如小于400px时,ssh界面会锚定在最顶部。当输出比较多的命令被执行之后你就看不到光标了,除非盲打一个clear命令。。第二个是似乎webssh不支持很大量的数据交互。我尝试着cat了一个5M多的文件时,崩溃了。。不过我本来就是拿这个东西来做一个简单的ssh的,没必要继续加强性能。

  以上。两天终于找到了一个好一点的解决办法。。

原文地址:https://www.cnblogs.com/franknihao/p/8963634.html

时间: 2024-11-09 10:41:47

【webssh】网页上的SSH终端的相关文章

烂泥:通过SSH终端管理ESXI虚拟机

本文首发于烂泥行天下. 今天在ESXI上的一台windows系统的虚拟机(以下简称VM),突然nagios报警提示说:该机器发生故障. 既然问题出来了,就要解决.先在本机ping下那台VM,发现不能ping通.使用vsphere登录到ESXI,发现该VM还处于运行状态,但是无法远程进去,一直显示的是黑屏. 打算直接在ESXI上重启该机器,但是却提示如下的错误信息: 因为不想安装ESXI的其他管理工具,所以就打算通过ESXI的SSH直接重启VM. 通过SSH关闭VM有两种方法:一是使用ESXi命令

Windows 上的 SSH?使用 PowerShell Remoting 远程管理 Windows 服务器

Windows 上的 SSH?使用 PowerShell Remoting 远程管理 Windows 服务器 2018-07-01 Windows 约 2202 字 预计阅读 5 分钟 文章目录 Windows 世界的远程管理 基于 WinRM 的 PowerShell Remoting 配置无密码 的 PowerShell Remoting 体验 在 Linux/Unix 世界里 SSH 是个好东西,SSH 是 Secure Shell 的缩写,用它可以很容易连接到指定的服务器,并执行特定命令

网页上传整个文件夹

网页上传整个文件夹+断点续传 一.概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Content-Range实体头.HTTP协议本身不支持断点上传,需要自己实现. 二.Range 用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式: Range:用于客户端到服务端的请求,可以通过改字段指定下载文件的某一段大小及其单位,字节偏移从0开始.典型格式: Ra

jupyter notebook在网页上显示作图

今天尝试使用jupyter notebook作图像展示工具时,发现用matplotlib所作的图像会自动启动一个图像展示窗口,无法显示在网页上,而我的初衷是使用jupyter notebook做图像即时呈现及存储(有点类似PPT作图). 随机生成一批正弦数据: import numpy as np import matplotlib.pyplot as plt x=np.arange(10) y=np.sin(x) plt.plot(x,y) plt.show() 使用%matplotlib命令

将数据库中的信息显示在网页上

用下拉列表的方式输出在网页上,都在php格式里面便可以输出: <body> <?php $db = new mysqli("localhost","root","12345678","heiheihei"); $sql = "select * from student"; $result = $db->query($sql); echo "<select>&qu

获取网页上数据(图片、文字、视频)-b

Demo地址:http://download.csdn.net/detail/u012881779/8831835 获取网页上所有图片.获取所有html.获取网页title.获取网页内容文字... .h 文件  代码: //网页   //NSString *strPath = [NSString stringWithFormat:@"http://www.baidu.com/s?wd=%@&cl=3",theWord];   //视频   //NSString *strPath

css015 定位网页上的元素

css015 定位网页上的元素 一.   定位属性的功能 1.         四中类型的定位 Position: absolute relative fixed static a. 绝对定位 绝对定位通常单位为:px  em  percentage 绝对定位会脱离页面流,相对的是整个浏览器 如果a标签在设定了absolute relative fixed值的b标签中,那么a标签就是性对与b标签定位. b.相对定位 相对定位是相对于当前html流中的当前位置进行定位的. c. 固定定位 Back

CSS3-基于浮动的布局,响应式WEB设计,定位网页上的元素,设计打印页面的css技术

基于浮动的布局: 1.除非图片设置了宽度,否则始终应该要对浮动的图片设置一个宽度,这样可以让浏览器给其他内容腾出环绕的空间 2.当侧边栏的高度与主内容区的高度不一致的时候,可以用个margin进行调整 3.在一个非浮动元素<div>中存在一个浮动元素,当浮动元素高于元素本身的时候,内容就会溢出<div>中,解决方案如下: A:在</div>介绍之前添加一个换行,并且添加一个类<br class=”clear”/>,之后创建一个样式br.class{clear

前端菜鸡之路——网页上的图标

如何在页面上放置我们需要的图标,这个问题从我学习前端以来便一直伴随着我,从开始的全部用img标签来放图标到之后的用雪碧图,用字体,但是再多的方法也要懂得如何在不同的情形下去使用这些方法.所以刚在加班中过完圣诞的我坐在了电脑前,想要对这些熟悉而又陌生的东西进行整理和总结. 首先是从img标签说起,当我第一次切图时便和它邂逅,当时觉得好神奇,给它一个路径居然可以找到我想要的图片,并且展示出来,功能有点类似于快递员,于是我开始频繁的收各种快递,用到图片的地方都选择使用它.虽然这么做并不算错,但很显然不