精华内容
下载资源
问答
  • 浏览器网页上的SSH终端webssh:pip install webssh
    2021-12-24 15:09:54
    pip install webssh==1.5.3
    
    wssh
    
    默认端口是8888
    

    WebSSH,是 huashengdun 在 Github 上开源的 SSH 终端 Web 应用,项目地址为
    https://github.com/huashengdun/webssh,目前版本为 1.5.3。WebSSH 使用 Python
    编写,基于 tornado、paramiko 和 xterm.js库,支持用户名密码登录、密钥登陆和双因素认证,命令行窗口支持全屏且可改变大小,并支持主流的现代浏览器。

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

    可参考链接:
    https://www.jianshu.com/p/af2a765c4c4c

    更多相关内容
  • 但这些种种的目的,都离不开非常细小的技术支持,下面我们就来讨论如何搭建一个自动化运维平台,本文先讲一讲运维平台较重要的技术之一的webssh。 一、技术选型&实现思路 1.后端逻辑,选用:Django框架 2.模拟...

    背景

    现在几乎所有东西都向往着自动化,在运维界更是如此,运维人员都向往自动化代替人工操作、解决人工操作大量重复性工作的问题、故障主动恢复:及时发现;流程;解决。运维规范化:角色定义和责任划分、流程化等。但这些种种的目的,都离不开非常细小的技术支持,下面我们就来讨论如何搭建一个自动化运维平台,本文先讲一讲运维平台较重要的技术之一的webssh。

    一、技术选型&实现思路

    1.后端逻辑,选用:Django框架

    2.模拟web终端,选用:xterm

    3.实现远程主机连接,建立ssh通道,python库:paramiko

    4.实现web远程连接必须需要实时保持前后端通信,使用技术:websocket

    5.技术流程图
    在这里插入图片描述

    二、实现

    2.1.创建webssh页面

    xterm.js是一个开源模拟终端,利用它我们可以创建一个比较正规好看的终端界面。

    <!doctype html>
      <html>
        <head>
        <link rel="stylesheet" href="/static/xterm_/xterm.css"  />
        <link rel="stylesheet" href="/static/xterm_/bootstrap3.css"  />
        </head>
        <body>
        <div id="terminal"></div>
        </body>
    <script src="/static/xterm_/xterm.js"></script>
    <script src="/static/xterm_/jquery.js"></script>
    <script src="/static/xterm_/ssh.js"></script>
      </html>
    

    其中 ssh.js:
    新建一个Xtrem实例,并且发起websocket连接,建立websocket通道。建立起通道前端就能与后端进行通信,保证数据传输。

    var window_width = $(window).width();
    var window_height = $(window).height();
    var term = new Terminal(
        {
            cols : Math.floor(window_width/9),     //列数
            rows : Math.floor(window_height/18),   //行数
            convertEol : true,  //启用时,光标将设置为下一行的开头
            cursorBlink: true, //光标闪烁
            rendererType: "canvas",  //渲染类型
        }
              );
    $(function () {
        var sock = new WebSocket("ws://" + window.location.host + "{% url 'webssh' %}");
        // 打开webssh页面就打开web终端,并且打开websocket通道
        sock.addEventListener("open",function () {
            term.open(document.getElementById('terminal'));
            term.writeln('等待10s,出现命令行表示连接成功,没有出现则表示连接失败(检查参数跟网络)。');//这里连接失败是表示ssh连接失败.
        });
        //获取从ssh通道获取的outdata
        sock.addEventListener("message",function (recv) {
            term.write(recv.data);
            });
        //输入shelldata并发送到后台
        term.on("data",function (data) {
            sock.send(data)
            });
        window.sock=sock;
    });
    

    2.2后台逻辑

    后台是前端与服务器之间的桥梁,可以理解成中转站。具体实现思路在代码注释中有讲解。

    from dwebsocket.decorators import accept_websocket
    
    @accept_websocket  #用于websocket连接的修饰器
    def webssh(request):
        global ip, port, user, passwd  #定义全局变量连接信息.
        if request.session.get('login')==None:  #判断是否登陆系统,如果没有就去登陆!
            return redirect('/sys/login/')
        if not request.is_websocket():#判断websocket连接,如果是普通的http连接就获取传送进来的登陆信息。
            ip = request.POST.get('conip')
            port = request.POST.get('conport')
            user = request.POST.get('conuser')
            passwd = request.POST.get('conpass')
            print(ip,str(port),user,passwd)
            return render(request, 'html/webssh.html', locals())
        else:    #如果是websocket连接就创建ssh连接,使用paramiko模块创建
            client = paramiko.SSHClient()   #创建连接对象
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy)  #设置自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认
            try:   #用异常抛出判定主机是否成功连接ssh
                client.connect(hostname=ip,port=port,username=user,password=passwd)  #connetc为连接函数
                print(f'主机{ip}连接成功!')
                mess = f'主机{ip}连接成功!'
            except:
                print(f'主机{ip}连接失败,请确认输入信息!')
                mess = f'主机{ip}连接失败!'
    
            sshsession = client.get_transport().open_session() #成功连接后获取ssh通道
            sshsession.get_pty() #获取一个终端
            sshsession.invoke_shell() #激活终端
            for i in range(2):   #激活终端后会有信息流,一般都是lastlogin与bath目录,并获取其数据
                messa = sshsession.recv(1024)
                request.websocket.send(messa) 
            print(request.websocket)
    
            def srecv():  #从ssh通道获取输出data,并发送到前端
                while True:
                    sshmess = sshsession.recv(2048)
                    if not len(sshmess):
                        print('退出监听发送循环')
                        return
                    request.websocket.send(sshmess)
                    print('ssh回复的信息:' + sshmess.decode('utf-8'))
                    print(len(sshmess))
    
            for shell in request.websocket:   #获取前端的shelldata并且发送到服务器执行
                deshell = shell.decode('utf-8')
                print('deshell:'+deshell)
                # stdin,stdout,stderr = client.exec_command(deshell)  
                # request.websocket.send(stdout.read())
                # request.websocket.send(stderr.read())  
                sshsession.send(deshell)
                # while True:
                #     sshmess = sshsession.recv(2048)
                #     request.websocket.send(sshmess)  
                #     print('ssh回复的信息:'+sshmess.decode('utf-8'))
                #     print(len(sshmess))
                sshrecvthre = Thread(target=srecv, args=()).start()  #启用线程监听ssh通道获取输出data,并发送到前端
    

    2.3效果
    在这里插入图片描述

    结束

    Webssh的应用十分的广泛,并且在网络的复杂环境中很难确保它的通信安全,但是针对自己网络所自己编写的webssh往往安全性会有提升,以上只是对功能实现上进行了说明,若要对安全上进行防范,还需要对以上代码进行改造。

    一个web远程连接与主机的正删改查只是一个运维系统的基础功能,下次我们来说一下webssh终端如何实现录像回放~

    展开全文
  • 1.模拟web终端,技术:xterm 2.实现远程主机连接,建立ssh通道,python库:paramiko 3.实现web远程连接必须需要实时保持前后端通信,使用技术:websocket 技术流程图(画的有点潦草哈,因为懒哈哈): 其中 ssh....
  • docker-webssh 在Docker中运行Webssh 不知道吗我很确定这个项目不是您想要的。 只是跳过它。 老实说,我也在研究它,虽然不能说太多,但确实是您想要的一个很酷的工具。 不要犹豫,尝试一下! 一个简单的Web SSH...
  • webssh】网页上的SSH终端

    千次阅读 2018-04-27 17:34:00
     广义上来说,webssh泛指一种技术可以在网页上实现一个SSH终端。从而无需Xshell之类的模拟终端工具进行SSH连接,将SSH这一比较低层的操作也从C/S架构扭成了B/S架构。  能实现webssh的组件有好几种,但归根结底都...

    【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项目部署成https也简单,只要修改下webssh的tornado框架用到的一些源码就可以了。

      在main.py中,原先服务进程的监听启动是通过app.listen这样的方式来做的。现在只要将这部分注释掉然后重新建立一个http_server对象来监听:

    import tornado
    # ...略
    http_server = tornado.httpserver.HTTPServer(app, ssl_options={
      'certfile': 'your/path/to/certificate.crt',
      'keyfile': 'your/path/to/key.key'
    })
    http_server.listen(options.port,options.address)
    # ...略

     

      这样就可以通过https来访问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的,没必要继续加强性能。

       * 关于第一个问题还有一些小补充。webssh模拟终端的界面的大小是个很微妙的东西,上面说了高度的问题,另外还有一个宽度的问题。一般情况下,为了能够动态适配窗口的大小,我们可以实时获取window.height和window.width,然后通过计算获得到webssh终端合适的高和宽。对于width,webssh利用的前端组件xterm.js有一个问题就是最多每行只能显示80个字符。或许你可以尝试修改Terminal对象生成时传入方法的参数cols(其默认值是80),但是只要其值设置为大于80的时候就会发生超出80字符宽度部分的字符串不会自动换行,而是到本行开头去覆盖本行。

      google了挺久没有找到合适的解决方案,github上官方给出的解释是因为被连接服务器本身的tty终端字符宽度就是80,而xterm.js必须和这个宽度一样才可以正常工作。。为了webssh终端能够正常地自动换行同时也要尽量避免webssh终端区域大片屏幕都被浪费,一个曲线救国的办法就是把终端窗口宽度刚好调节成80个字符再宽一点点的样子,比如780px左右(根据屏幕大小不同可能不同)。

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

    展开全文
  • Shell In A Box:一款访问远程Linux服务器的SSH终端_Mr_John_Liang的博客-CSDN博客 一、Ubuntu16.04 安装并配置shellinabox sudo apt-get install openssl shellinabox 二、配置Shellinabox 端口(默认端口是...
    展开全文
  • 基于WebSSH终端调研

    2020-08-13 20:49:22
    Web-based SSH使得通过浏览器就可以访问SSH Shell终端,通俗来将,使用浏览器代替Xshell之类的客户端工具。有两种实现方式: JavaScript/Ajax或者JavaScript/WebSockets。 基于Web的客户端通常分成两个两个部分: ...
  • webssh远程登录

    2018-08-07 11:03:28
    使用web结合python开发的ssh远程连接linux工具方便与安全管理机器
  • 背景 现在几乎所有东西都向往着自动化,因为自动化让人舒服呀因为...1.模拟web终端,技术:xterm 2.实现远程主机连接,建立ssh通道,python库:paramiko 3.实现web远程连接必须需要实时保持前后端通信,使用技术:we...
  • 网页终端直接操作linux系统【webssh

    千次阅读 2022-04-06 16:49:21
    1、安装pip linux系统默认都安装了python,但不一定安装了pip,所以先安装pip ...2、安装webssh pip install webssh 安装成功如图 3、启动webssh wssh 4、访问 使用http://ip:8888访问
  • 本文介绍了详解基于django实现的webssh简单例子,分享给大家,具体如下: 说明 新建一个 django 程序,本文为 chain。 以下仅为简单例子,实际应用 可根据自己平台情况 进行修改。 打开首页后,需要输入1,后台去...
  • 在linux机器上安装python环境,并且使用命令pip3 install webssh,装上这个模块 我们就可以在浏览器web页面登录我们的linux机器,是不是很强大! 功能 支持SSH密码验证,包括空密码。 支持SSH公钥认证,包括DSA RSA ...
  • 基于goapp+xterm实现webssh-网页上的SSH终端,linux管理工具。 开源地址见文末。 特性 在网页上实现一个SSH终端。从而无需Xshell之类的模拟终端工具进行SSH连接。 可以对交互命令进行审计、记录 在页面上按一个键,...
  • 点击下方“民工哥技术之路”,选择“设为星标”回复“1024”获取独家整理的学习资料!webssh简介这个工具是使用Python开发,可以从下面地址了解详情。官网:https://pypi....
  • webssh docker 镜像制作及其应用

    千次阅读 2019-04-11 02:09:37
    webssh介绍 webssh 一个简单的Web应用程序,用作连接到ssh服务器的ssh客户端。 它是用Python编写的,基于龙卷风,paramiko和xterm.js。 特征 支持SSH密码验证,包括空密码。 支持SSH公钥认证,包括DSA RSA ECDSA Ed...
  • 目标实现效果:在页面实现Linux终端连接所需工具:Django,Linux,VueXtrem.jsDWebSocketparamikoSSHWebSSH在线编程工具介绍首先我们需要 在页面的一个终端模拟器。XTerm 就会解决这个,找到 vue 项目中的 package....
  • 30-开源web终端ssh解决方案,如vue-webssh
  • 公告 该项目仍处于beta版本。 它已被新的项目取代。 Django-gateone 由django实现的gateone 贡献 我们强烈鼓励所有贡献! 您可以添加新功能,报告和修复现有的错误以及编写文档和教程。 随时打开问题或发送拉动请求...
  • [GitHub版本](https://badge.fury.io/gh/billchurch/webssh2.svg)](https: //badge.fury.io/gh/billchurch/webssh2)使用ssh2,socket.io,xterm.js并表示HTML5的基于Web的终端仿真器和SSH客户端的基本示例的Web ...
  • 点击蓝字关注这个神奇的公众号~ttyd 是一个简单的命令行工具,用于在 Web 上共享终端,简单点说就是可以实现在网页上使用SSH终端服务,并且该软件是免费开源的。安装ttydttyd作者...
  • 它有内置的运行作为指定端口上基于WebSSH客户端并提示您一个网络终端仿真程序,而不需要访问和控制远程使用任何AJAX / JavaScript和CSS功能的浏览器你的Linux服务器的SSHShell Web服务器任何额外的浏览器插件,如...
  • 简析基于goapp+xterm实现webssh-网页上的SSH终端,linux管理工具。开源地址见文末。特性在网页上实现一个SSH终端。从而无需Xshell之类的模拟终端工具进行SSH连接。可以对交互命令进行审计、记录在页面上按一个键,就...
  • 偶尔看到阿里云远程连接终端功能挺有意思的,自己无聊就搭了一个,今天给大家分享一下个人比较好用的,可以实现单点登录概念,让运维从系统中直接无输入式SSH连接至终端~~~ 首先,咱们要确保的就是安装环境了~ ...
  • go web ssh推荐使用

    2021-09-18 14:14:13
    go web ssh推荐使用 文章目录go web ssh推荐使用1. 前言2. 项目地址3. 简单修改4. 交叉编译5. 结果展示 1. 前言 一般ssh的登录使用需要ssh客户端进行登录,比如xshell、putty等,之前我们也推荐过九款:...
  • 网页版终端webssh2配置

    2019-02-21 14:38:33
    开源项目webssh2可以实现浏览器访问终端,参照网上教程实践后,记录步骤如下:安装NVMcurl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash source ~/.bashrc安装稳定版node.jsnvm...
  • 神器webssh学习笔记

    2021-06-22 23:23:41
    项目主页:https://github.com/huashengdun/webssh 一个简单的 Web 应用程序,用作 ssh 客户端以连接到您的 ssh 服务器。它是用 Python 编写的,基于 tornado、paramiko 和 xterm.js。 特征: 支持SSH密码认证,...
  • java实现web ssh客户端

    2020-12-31 21:59:24
    使用java语言实现web ssh客户端,使用websocket的stomp协议+xterm.js实现 效果如下: 0、引入依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-...
  • 类似于一个web putty,即通过浏览器实现ssh远程访问功能基于 HTML5 技术,无需任何浏览器插件。下载地址:https://github.com/liftoff/GateOne/downloads安装apt-get purge python-tornadoapt-get install python-...
  • websocket 目前市面上大多数的 webssh 都是基于 websocket 协议完成的 django-channels django 的第三方插件, 为 django 提供 websocket 支持 xterm.js 前端模拟 shell 终端的一个库 paramiko python 下对 ssh2 封装...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,836
精华内容 11,134
关键字:

web的ssh终端