精华内容
下载资源
问答
  • 基于Web的SSH终端调研

    2020-08-13 20:49:22
    基于Web的客户端通常分成两个两个部分: 客户端: JS和动态HTML用于捕获键盘事件,与服务器交换信息。 服务端: 前端请求在web后端处理,键盘事件转发到安全shell客户端与连接的SSH服务器(运行sshd的远程主机)交互...

    Web-based SSH使得通过浏览器就可以访问SSH Shell终端,通俗来将,使用浏览器代替Xshell之类的客户端工具。有两种实现方式:
    JavaScript/Ajax或者JavaScript/WebSockets。

    基于Web的客户端通常分成两个两个部分:

    客户端: JS和动态HTML用于捕获键盘事件,与服务器交换信息。
    服务端: 前端请求在web后端处理,键盘事件转发到安全shell客户端与连接的SSH服务器(运行sshd的远程主机)交互。终端输出直接转给客户端(客户端使用JavaScript转换成HTML,比如: vt100.js),或者处理成HTML直接返给前端。

    web tty

    yum update && yum install epel-release git
    git clone https://github.com/butlerx/wetty.git
    cd wetty
    npm install
    wget https://nodejs.org/dist/v12.18.3/node-v12.18.3-linux-x64.tar.xz
    yum install gcc-c++
    # npm 换源参考https://www.jianshu.com/p/4aaf929bfa71
    npm install -g yarn
    yarn global add wetty
    wetty --sshhost 192.168.10.3 --port 8080
    

    访问:http://192.168.10.3:8080/wetty

    在这里插入图片描述

    展开全文
  •  广义上来说,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左右(根据屏幕大小不同可能不同)。

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

    展开全文
  • 1.模拟web终端,技术:xterm 2.实现远程主机连接,建立ssh通道,python库:paramiko 3.实现web远程连接必须需要实时保持前后端通信,使用技术:websocket 技术流程图(画有点潦草哈,因为懒哈哈): 其中 ssh....
  • 不少云服务器网页后台就能登录服务器,并可以在浏览器上进入命令行交互。能不能在自己也部署一个呢...WebSSH简介WebSSH,是 huashengdun 在 Github 上开源 SSH 终端 Web 应用,项目地址为 https://github.com...

    不少的云服务器的网页后台就能登录服务器,并可以在浏览器上进入命令行交互。能不能在自己也部署一个呢?能不能配置一个更加符合自身需求的网页 SSH 终端呢?或许可以以此做一个更好的运维管理平台?来看看 Python 编写的 WebSSH 吧!

    1aa56c35d662c676714b3238e6b0adbf.png

    WebSSH

    简介

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

    7893bc42dbdf2d74f527a0d0fe0727fa.png

    WebSSH

    安装

    WebSSH 要求 Python2.7 或 3.4+。如果有 Python 环境,可以使用 pip 进行安装:

    pip install webssh

    也可以使用 Docker 运行,下载源码后在项目根目录运行

    docker-compose up

    即可使用项目所包含的 docker-compose.yml 进行运行部署运行。

    示例

    WebSSH 在安装完成后,可以直接执行

    wssh

    运行服务,此时服务默认运行在 127.0.0.1:8888,可以进行访问,显示的是一个 SSH 登录界面:

    9b7704a61b803fa932004090ddfaf3e3.png

    WebSSH登录界面

    可以看到,登录的表单输入包括了主机、密码、用户名、密码、密钥、口令短语和一次性密码的输入,用户可以根据自身所需的登录验证方式进行输入,最后点击 Connect 进行连接。连接成功后,网页就会显示所登录的命令行界面:

    debbbc8f0f1f3691f57a1fff7097a662.png

    WebSSH命令行界面

    命令行界面由 xterm.js 渲染,十分美观实用。

    WebSSH 还提供了命令行参数来进行配置:

    # 在主机2.2.2.2和端口8000上启动服务wssh --address='2.2.2.2' --port=8000# 启动一个HTTPS服务,指定证书和私钥wssh --certfile='/path/to/cert.crt' --keyfile='/path/to/cert.key'# 对于不在known_hosts上的主机的登录进行拒绝wssh --policy=reject# 设置日志等级为debugwssh --logging=debug# 指定日志文件wssh --log-file-prefix=main.log# 帮助,更多选项wssh --help

    如果对命令行的字体不满意,可以把新的字体文件放置在 webssh/static/css/fonts/ 中进行修改。

    此外,WebSSH 支持使用 URL 参数进行登录,和进行命令行窗口的外观设置:

    • 传递主机、端口、用户名和 base64 编码的密码进行登录
    http://localhost:8888/?hostname=xx&username=yy&password=str_base64_encoded
    • 设置命令行背景颜色
    http://localhost:8888/#bgcolor=green
    • 设置命令行标题
    http://localhost:8888/?title=my-ssh-server
    • 设置命令行字符编码
    http://localhost:8888/#encoding=gbk
    • 设置登录后马上执行的命令
    http://localhost:8888/?command=pwd
    • 设置命令行类型
    http://localhost:8888/?term=xterm-256color

    部署

    可以使用 Nginx 进行反向代理,

    wssh --address='127.0.0.1' --port=8888 --policy=reject
    # Nginx配置location / {    proxy_pass http://127.0.0.1:8888;    proxy_http_version 1.1;    proxy_read_timeout 300;    proxy_set_header Upgrade $http_upgrade;    proxy_set_header Connection "upgrade";    proxy_set_header Host $http_host;    proxy_set_header X-Real-IP $remote_addr;    proxy_set_header X-Real-PORT $remote_port;}

    也可以直接部署为独立服务。

    wssh --port=8080 --sslport=4433 --certfile='cert.crt' --keyfile='cert.key' --xheaders=False --policy=reject

    注意为了安全考虑,部署时要使用 SSL 加密,且一般设置 policy 为 reject,拒绝不在 known_hosts 上的主机连接。

    WebSSH 项目的作者在其个人主页上进行了部署,可以进行试用参考。

    4fe4915a8ec47a8d8e88bcd0cf986b7c.png

    WebSSH

    总结

    作为一个网页 SSH 终端,WebSSH 功能齐全,美观实用,部署简单,可以快速实现 SSH 登录功能。WebSSH 支持大量的个性化配置,可以调配适合自己审美的界面。同时 WebSSH 使用 Python 开发,易于进行二次开发,便于添加扩展功能;后端使用了 tornado 框架,在性能上也可以放心。

    WebSSH 是一个典型的 Web 应用,代码简洁,功能清晰,是一个值得参考的 Python 开发的 Web 应用项目。感兴趣的开发者可以在其基础上开发插件,实现更多功能。

    展开全文
  • 继续补充一个web远程ssh终端录像回放功能。 一、思路 网上找了一下大家实现webssh录像回放方案,度娘搜文章统一都是—用asciinema!仔细看了相关技术文档之后确实阿!我一开始以为需要视频文件。没想到,...

    背景

    趁着上次实现了基础的运维系统功能—-webssh,那就趁热打铁!继续补充一个web远程ssh终端录像回放功能。

    一、思路

    网上找了一下大家实现webssh录像回放的方案,度娘搜的文章统一都是—用asciinema!仔细看了相关技术文档之后确实阿!我一开始以为需要视频文件。没想到,asciinema用特定的格式文件就可以实现视频流。(在写asciinemaweb技术的时候有个大坑- -.琢磨我两个小时,待会说具体问题)

    asciinema实际就是 通过系统输出的信息,将信息写成asciinema特定的格式文件,包含header与data两大部分(也是待会从文章中讲解两部分的结构)。它就能解析成视频。所以我们在昨天的功能逻辑之上:

    1.连接ssh成功后,构造头部内容写入文件中

    2.将开头两条输出信息以特定的格式写入文件中

    3.将线程监听回来的所有输出信息以特定的格式写入文件中

    其中2.3已经包含了我们webssh所有的输出信息了,已经足以构成录像回放

    4.创建html页面展示回访列表

    二、实现

    0.先说明一下asciinema文件的格式。

    头部:

    header = {
        "version": 2,  #(asciinema)版本
        "width": 160, #(asciinema)回放时的宽度
        "height": 48, #(asciinema)回放时的高度
        "timestamp": date, #(asciinema)时间戳 用于播放
        "env": {"SHELL": "/bin/bash",  #(asciinema)使用的shell类型
        "TERM": "xterm-256color"}, #(asciinema)终端颜色
        "title": "video"  #(asciinema)标题
    }
    

    data:

    [0.00699162483215332, “o”, “Last login: Thu May 7 18:42:13 2020 from 192.168.254.1\r\r\n”]
    [0.1905069351196289, “o”, "[root@leestudy ~]# "] #第一个字段为时间戳,第二个字段“o”为输出,“i”为输入,第三个字段为“(o)输出信息/(i)输入信息”

    1.连接ssh成功后写入header

            sshsession = client.get_transport().open_session()
            sshsession.get_pty()
            sshsession.invoke_shell()
    
            asciinemadir = settings.BASE_DIR + '/static/asciinemadir/' #定义一个存放文件的目录(喜欢的也可以保存在数据库)
            if not os.path.isdir(asciinemadir):
                os.makedirs(asciinemadir)
            starttime=time.strftime("%Y%m%d%H%M%S") #用于记录开始时间
            filena =ip+starttime         #文件名,用ip+开始时间为文件名
            date=time.time()             #开始时间戳
            print(date)
            header = {
                "version": 2,
                "width": 160,
                "height": 48,
                "timestamp": date,   #开始时间戳
                "env": {"SHELL": "/bin/bash",
                "TERM": "xterm-256color"},
                "title": "video"
            }
    
            writedata= open(asciinemadir + filena, 'w') #打开文件
            writedata.write(json.dumps(header) + '\n')  #将header写入文件
    

    2.将开头两条输出信息以特定的格式写入文件中

            for i in range(2):
                messa = sshsession.recv(1024)
                request.websocket.send(messa)  
                demessa = messa.decode('utf-8')
                iodata = [time.time() - date, 'o', f'{demessa}'] #构造格式
                writedata.write(json.dumps(iodata)+'\n') #写入文件
    

    3.将线程监听回来的所有输出信息以特定的格式写入文件中

    def srecv():
                    while True:
                        sshmess = sshsession.recv(2048)
                        if not len(sshmess):
                            print('退出监听发送循环,并关闭写入文件')
                            writedata.close()   #如果不再监听通道,则关闭文件
                            break
                        request.websocket.send(sshmess)
                        print('ssh回复的信息:' + sshmess.decode('utf-8'))
                        print(len(sshmess))
                        desshmess = sshmess.decode('utf-8')
                        iodata2 = [time.time() - date, 'o', f'{desshmess}']#构造格式
                        writedata.write(json.dumps(iodata2) + '\n')#写进文件
    

    4.创建html页面展示回访列表

    在创建html前需要创建一个新的表用于存放录像列表的信息

    models下:
    
    class video(models.Model):
        hostaddress = models.CharField(max_length=255)
        username = models.CharField(max_length=255)
        filename = models.CharField(max_length=255)
        starttime = models.CharField(max_length=255)
        overtime = models.CharField(max_length=255)
    

    ####(创建好列表信息后需要进行数据库记录与迁移python manage.py makemigrations与python manage.py migrate)

    接着在关闭websocket时创建一条数据,并且在关闭websocket时也关闭文件,判断是否关闭只要用try异常机制即可.

      except:
                addvideolist = models.video()
                addvideolist.hostaddress = ip
                addvideolist.username = request.session['username']
                addvideolist.filename = filena
                addvideolist.starttime = starttime
                addvideolist.overtime = time.strftime("%Y%m%d%H%M%S")
                addvideolist.save()
                writedata.close()
                print('中断websocket,关闭文件写入')
    

    接着创建html页面展示回放:

    (坑了我两个小时的就是这个asciinemaplayer的js文件,在网上找了很多的asciinemaplayerjs文件,统统都不行!解析不出来!(解坑前根本不知道是JS的问题!)连官方下载的demo都解析不出来,全是在比较大型的网站下的- -.然后我看了下官网(https://asciinema.org/)里面的展示都可以解析的啊!demo都一毛一样!然后索性找了一个demo的首页,点开F12直接找它的js算了!!结果一引用,成了。我靠!!也不知道是不是我的问题)最后给上jshttps://asciinema.org/js/asciinema-player-e90dd959bf7df7e1608c08ac419fca67.js?vsn=d

    现在视图中创建页面函数:

    def Videotape(request):
    videolist = models.video.objects.all()
    return render(request, ‘html/Videotape.html’, locals())

    然后再编写html页面(引用了AdminLte模板)

    {% extends 'base.html' %}
    {% load static %}
    {% block title %}录像{% endblock %}
    {% block css %}
         <link rel="stylesheet" href="{% static 'adminlet-2.4.10/bower_components/datatables.net-bs/css/dataTables.bootstrap.css' %}">
        <link rel="stylesheet" href="{% static 'asciinemaplayer/asciinema-player.css' %}">
    {% endblock %}
    
    <!-- 顶部内容  -->
    {% block breadcrumb %}
        <!-- Content Header (Page header) -->
        <section class="content-header">
          <h1></h1>
        </section>
    {% endblock %}
    
    <!-- 身体内容  -->
    {% block content %}
    
        <!-- playvideo模态框 -->
    <div class="modal fade bs-example-modeal-lg" id="playvideo" tabindex="-1" role="dialog" aria-labelledby="playvideoLabel">
      <div class="modal-dialog modal-lg" role="document">
        <div class="modal-content">
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <h4 class="modal-title" id="addhostlLabel">录像播放</h4>
          </div>
          {% csrf_token %}
          <div class="modal-body">
              <div class="modal-body" id="play">
          </div>
    
    
          </div>
    
          <div class="modal-footer">
    
          </div>
        </div>
      </div>
    </div>
    
    
    
    
    
        <!-- datatable -->
          <div class="box box-default">
    
            <div class="box-header with-border">
              <h3 class="box-title">录像列表</h3>
            </div>
    
            <div class="box-body">
        <table id="Videolist" class="display" style="width:100%">
                        <thead>
                <tr>
                  <th>主机地址</th>
                  <th>操作人</th>
                  <th>录像文件名</th>
                  <th>开始时间</th>
                  <th>结束时间</th>
                  <th>操作</th>
                </tr>
                </thead>
                <tbody>
              {% for videoli in videolist %}
                  <tr>
                  <td>{{ videoli.hostaddress }}</td>
                  <td>{{ videoli.username }}</td>
                  <td>{{ videoli.filename }}</td>
                  <td>{{ videoli.starttime }}</td>
                  <td>{{ videoli.overtime }}</td>
                  <td><input type="button" value="查看录像" style="float: left" class="btn btn-success" onclick="play('{{videoli.filename}}')"/></td>
                  </tr>
                {% endfor %}
                </tbody>
        </table>
            </div>
          </div>
    
    
    
    
    
    
    
    {% endblock %}
    
    <!-- JS内容  -->
    {% block script %}
    <script src="{% static 'adminlet-2.4.10/bower_components/datatables.net/js/jquery.dataTables.min.js' %}"></script>
    <script src="{% static 'adminlet-2.4.10/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js' %}"></script>
    <script src="{% static 'asciinemaplayer/asciinema-player-e90dd959bf7df7e1608c08ac419fca67.js' %}"></script>
        <script type="text/javascript">
        //datatable配置
        $(document).ready(function() {
        $('#Videolist').DataTable({
    
           language: {
               "sProcessing": "处理中...",
               "sLengthMenu": "显示 _MENU_ 项结果",
               "sZeroRecords": "没有匹配结果",
               "sInfo": "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
               "sInfoEmpty": "显示第 0 至 0 项结果,共 0 项",
               "sInfoFiltered": "(由 _MAX_ 项结果过滤)",
               "sInfoPostFix": "",
               "sSearch": "搜索:",
               "sUrl": "",
               "sEmptyTable": "表中数据为空",
               "sLoadingRecords": "载入中...",
               "sInfoThousands": ",",
               "oPaginate": {
                   "sFirst": "首页",
                   "sPrevious": "上页",
                   "sNext": "下页",
                   "sLast": "末页"
               },
               "oAria": {
                   "sSortAscending": ": 以升序排列此列",
                   "sSortDescending": ": 以降序排列此列"
               }
           },
              "paging": true,       <!-- 允许分页 -->
              "lengthChange": true, <!-- 允许改变每页显示的行数 -->
              "searching": true,    <!-- 允许内容搜索 -->
              "ordering": true,     <!-- 允许排序 -->
              "info": true,         <!-- 显示信息 -->
              "autoWidth": false
    
        });
    } );
    
    
    
    
    // 播放录像
    function play(file) {
      $('#play').html(
        '<asciinema-player id="play" src="/static/asciinemadir/'+file+'"></asciinema-player>'
      )
      $('#playvideo').modal('show');
    }
    
        </script>
    {% endblock %}
    

    5.最终效果
    在这里插入图片描述

    结束

    好啦,Django运维系统基础功能之—web远程ssh终端录像回放的功能就先到这里。后面的功能再慢慢补充吧~

    展开全文
  • 继续补充一个web远程ssh终端录像回放功能。 一、思路 网上找了一下大家实现webssh录像回放方案,度娘搜文章统一都是—用asciinema!仔细看了相关技术文档之后确实阿!我一开始以为需要视频文件。没想到,...
  • Bastillion是一款基于Web的SSH控制终端,该工具可以帮助广大开发人员集中管理针对目标系统的管理员权限访问。这款基于Web的管理工具还结合了用户公共SSH密钥的管理和分发,而密钥的管理需要基于配置文件中定义的用户...
  • 背景 现在几乎所有东西都向往着自动化,因为自动化让人舒服呀因为...1.模拟web终端,技术:xterm 2.实现远程主机连接,建立ssh通道,python库:paramiko 3.实现web远程连接必须需要实时保持前后端通信,使用技术:we...
  • 基于goapp+xterm实现webssh-网页上的SSH终端。 开源地址见文末。 特性 在网页上实现一个SSH终端。从而无需Xshell之类的模拟终端工具进行SSH连接。 可以对交互命令进行审计、记录 在页面上按一个键,就能打开一...
  • 基于goapp+xterm实现webssh-网页上的SSH终端,linux管理工具。 开源地址见文末。 特性 在网页上实现一个SSH终端。从而无需Xshell之类的模拟终端工具进行SSH连接。 可以对交互命令进行审计、记录 在页面上按一个键,...
  • 开源web终端ssh解决方案

    千次阅读 2016-09-30 15:24:23
    等众多 ssh 终端,为嘛还要弄个 web ssh ,不是够二吗?难道是为了装像么? 有个 web ssh ,的确没有多大作用,的确无法代替 ssh 客户端,但是你想过没有,类似于 xshell , secureRT , p
  • 一个简单的Web应用程序,用作ssh客户端以连接到ssh服务器。 它是用Python编写,基于龙卷风,paramiko和xterm.js。 产品特点 支持SSH密码身份验证,包括空密码。 支持SSH公钥身份验证,包括DSA RSA ECDSA Ed25519...
  • 项目地址:https://github.com/t924417424/ssh_manage开发框架Gin + gorm开发计划 ssh功能× 服务器文件管理在线演示点击进入SSH云管理平台环境Mysql Redis Go配置文件修改config.toml相关参数,短信接口使用阿里...
  • 好久都没来写博客,最近忙啥去了呢? 一是忙于saltstack的二次开发,二...许多人不是说,有了xshell,secureRT,putty等众多的ssh终端,为嘛还要弄个web的ssh,不是够二的吗?难道是为了装像么? 有个web的ssh,的...
  • 一个简单的Web SSH客户端。 用Python编写。 特征 支持SSH密码身份验证,包括空密码。 支持SSH公钥身份验证,包括DSA RSA ECDSA Ed25519密钥。 支持加密密钥。 支持两因素身份验证(基于时间一次性密码)。 ...
  • 追求完美不服输我,一直在与各种问题斗争路上痛并快乐着上一篇文章Django实现WebSSH操作Kubernetes Pod最后留了个问题没有解决,那就是terminal内容窗口大小没有办法调整,这会导致一个问题就是浏览器上可...
  • xterm.js : 前端模拟 shell 终端的一个库,当用户每输入一个键,就向后端发送该数据 paramiko : Python 下对 ssh2 封装一个库,可以使用他来远程连接主机 用户首先通过网页上WebSocket连接到后端,后端再通过...
  • 点击蓝字关注这个神奇公众号~ttyd 是一个简单命令行工具,用于在 Web 上共享终端,简单点说就是可以实现在网页上使用SSH终端服务,并且该软件是免费开源。安装ttydttyd作者...
  • SSH远程终端 WebConsole ,基于Golang、WebSocket、TermJS的SSH远程终端,希望能帮到大家。 主要应用到隔...
  • 追求完美不服输我,一直在与各种问题斗争路上痛并快乐着上一篇文章Django实现WebSSH操作Kubernetes Pod最后留了个问题没有解决,那就是terminal内容窗口大小没有办法调整,这会导致一个问题就是浏览器上可...
  • 它已被新项目取代。 Django-gateone 由django实现gateone 贡献 我们强烈鼓励所有贡献! 您可以添加新功能,报告和修复现有错误以及编写文档和教程。 随时打开问题或发送拉动请求! 当前,该项目有很多错误...
  • 当然,此附加组件还提供了一个基于的SSH服务器和一个基于Web的终端(可以包含在Home Assistant前端中)。 此外,它带有以下内容: 从家庭助理前端访问您的命令行! SSH的安全默认配置: 即使
  • Web的SSH控制台KeyBox.zip

    2019-07-16 07:13:57
    KeyBox 是一个基于 Web SSH 控制台,用于同步管理多个系统并且可执行远程命令。允许你共享终端命令并上传文件到所有系统。但连接会话打开时你可选择在其中一个终端或者多个终端上执行命令。此外可以添加额外...
  • 基于Golang、WebSocket、TermJS的SSH远程终端,希望能帮到大家。 主要应用到隔离网络内,SSH远程终端的访问问题。 欢迎大家踊跃报名,利用业余时间来拓展此项目,增加更多的功能服务大家。 更新日志 2016.03.05 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 434
精华内容 173
热门标签
关键字:

web的ssh终端