详解基于django实现的webssh简单例子


Posted in Python onJuly 17, 2018

本文介绍了详解基于django实现的webssh简单例子,分享给大家,具体如下:

详解基于django实现的webssh简单例子

说明

新建一个 django 程序,本文为 chain。

以下仅为简单例子,实际应用 可根据自己平台情况 进行修改。

打开首页后,需要输入1,后台去登录主机,然后返回登录结果。

正常项目 可以post 主机和登录账户,进行权限判断,然后去后台读取账户密码,进行登录。

djang后台

需要安装以下模块

安装后会有一个版本号报错,不影响

channels==2.0.2
channels-redis==2.1.0
amqp==1.4.9
anyjson==0.3.3
asgi-redis==1.4.3
asgiref==2.3.0
async-timeout==2.0.0
attrs==17.4.0

cd /tmp/
wget https://files.pythonhosted.org/packages/12/2a/e9e4fb2e6b2f7a75577e0614926819a472934b0b85f205ba5d5d2add54d0/Twisted-18.4.0.tar.bz2
tar xf Twisted-18.4.0.tar.bz2
cd Twisted-18.4.0
python3 setup.py install

启动redis

目录

chain/
    chain/
       settings.py
       asgi.py
       consumers.py
       routing.py
  templates/
      index.html

settings.py

# django-channels配置
CHANNEL_LAYERS = {
  "default": {
    "BACKEND": "channels_redis.core.RedisChannelLayer",
    "CONFIG": {
      "hosts": [("127.0.0.1", 6379)],
    },
  },
}

# 配置ASGI
ASGI_APPLICATION = "chain.routing.application"

consumers.py

from asgiref.sync import async_to_sync
from channels.generic.websocket import WebsocketConsumer

import paramiko
import threading
import time

from channels.layers import get_channel_layer
channel_layer = get_channel_layer()

class MyThread(threading.Thread):
  def __init__(self, id, chan):
    threading.Thread.__init__(self)
    self.chan = chan

  def run(self):
    while not self.chan.chan.exit_status_ready():
      time.sleep(0.1)
      try:
        data = self.chan.chan.recv(1024)
        async_to_sync(self.chan.channel_layer.group_send)(
          self.chan.scope['user'].username,
          {
            "type": "user.message",
            "text": bytes.decode(data)
          },
        )
      except Exception as ex:
        print(str(ex))
    self.chan.sshclient.close()
    return False

class EchoConsumer(WebsocketConsumer):

  def connect(self):
    # 创建channels group, 命名为:用户名,并使用channel_layer写入到redis
    async_to_sync(self.channel_layer.group_add)(self.scope['user'].username, self.channel_name)
    # 返回给receive方法处理
    self.accept()

  def receive(self, text_data):

    if text_data == '1':
      self.sshclient = paramiko.SSHClient()
      self.sshclient.load_system_host_keys()
      self.sshclient.set_missing_host_key_policy(paramiko.AutoAddPolicy())
      self.sshclient.connect('47.104.140.38', 22, 'root', '123456')
      self.chan = self.sshclient.invoke_shell(term='xterm')
      self.chan.settimeout(0)
      t1 = MyThread(999, self)
      t1.setDaemon(True)
      t1.start()
    else:
      try:
        self.chan.send(text_data)
      except Exception as ex:
        print(str(ex))

  def user_message(self, event):
    # 消费
    self.send(text_data=event["text"])

  def disconnect(self, close_code):
    async_to_sync(self.channel_layer.group_discard)(self.scope['user'].username, self.channel_name)

asgi.py

import os
import django
from channels.routing import get_default_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "chain.settings")
django.setup()
application = get_default_application()
routing.py
from channels.auth import AuthMiddlewareStack
from channels.routing import URLRouter, ProtocolTypeRouter
from django.urls import path

from .consumers import EchoConsumer

application = ProtocolTypeRouter({
  "websocket": AuthMiddlewareStack(
    URLRouter([
      path(r"ws/", EchoConsumer),
      # path(r"stats/", StatsConsumer),
    ])
  )
})

网页设置:

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>django webssh 例子</title>

  <link href="/static/css/plugins/ztree/awesomeStyle/awesome.css" rel="external nofollow" rel="stylesheet">

  <link href="/static/webssh_static/css/xterm.min.css" rel="external nofollow" rel="stylesheet" type="text/css"/>
  <style>
    body {
      padding-bottom: 30px;
    }

    .terminal {
      border: #000 solid 5px;
      font-family: cursive;
    {#        font-family: Arial, Helvetica, Tahoma ,"Monaco", "DejaVu Sans Mono", "Liberation Mono", sans-serif;#}{#        font-family: Tahoma, Helvetica, Arial, sans-serif;#}{#        font-family: "\5B8B\4F53","","Monaco", "DejaVu Sans Mono", "Liberation Mono", "Microsoft YaHei", monospace;#} font-size: 15px;
    {#        color: #f0f0f0;#} background: #000;
    {#        width: 893px;#}{#        height: 550px;#} box-shadow: rgba(0, 0, 0, 0.8) 2px 2px 20px;
    }

    .reverse-video {
      color: #000;
      background: #f0f0f0;
    }
  </style>
</head>
<body>

<div id="terms"></div>
</body>

<script src="/static/webssh_static/js/xterm.min.js"></script>
<script>
  var socket = new WebSocket('ws://' + window.location.host + '/ws/');

  socket.onopen = function () {

    var term = new Terminal();
    term.open(document.getElementById('terms'));

    term.on('data', function (data) {
      console.log(data);
      socket.send(data);
    });

    socket.onmessage = function (msg) {
      console.log(msg);
      console.log(msg.data);
      term.write(msg.data);
    };
    socket.onerror = function (e) {
      console.log(e);
    };

    socket.onclose = function (e) {
      console.log(e);
      term.destroy();
    };
  };

</script>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python标准库sched模块使用指南
Jul 06 Python
Python实现动态加载模块、类、函数的方法分析
Jul 18 Python
使用Python搭建虚拟环境的配置方法
Feb 28 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
May 26 Python
基于python实现简单日历
Jul 28 Python
python opencv 二值化 计算白色像素点的实例
Jul 03 Python
python入门之基础语法学习笔记
Feb 08 Python
PyCharm 无法 import pandas 程序卡住的解决方式
Mar 09 Python
基于python代码批量处理图片resize
Jun 04 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
Jun 22 Python
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
May 14 Python
Python 实现Mac 屏幕截图详解
Oct 05 Python
Python爬虫之网页图片抓取的方法
Jul 16 #Python
python编辑用户登入界面的实现代码
Jul 16 #Python
python 反向输出字符串的方法
Jul 16 #Python
解决python3 urllib 链接中有中文的问题
Jul 16 #Python
如何用Python实现简单的Markdown转换器
Jul 16 #Python
详解python里的命名规范
Jul 16 #Python
Python 2.7中文显示与处理方法
Jul 16 #Python
You might like
PHP 超链接 抓取实现代码
2009/06/29 PHP
php生成PDF格式文件并且加密
2015/06/22 PHP
WordPress的主题编写中获取头部模板和底部模板
2015/12/28 PHP
WordPress开发中短代码的实现及相关函数使用技巧
2016/01/05 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
dojo 之基础篇(二)之从服务器读取数据
2007/03/24 Javascript
js切换div css注意的细节
2012/12/10 Javascript
JavaScript中的值类型转换介绍
2014/12/31 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
2016/06/12 Javascript
javascript简易画板开发
2020/04/12 Javascript
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
快速搭建vue2.0+boostrap项目的方法
2018/04/09 Javascript
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
2018/12/06 NodeJs
基于Vue的商品主图放大镜方案详解
2019/09/19 Javascript
[02:54]辉夜杯主赛事第二日败者组 iG.V赛后采访
2015/12/26 DOTA
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
基于python实现微信模板消息
2015/12/21 Python
TensorFlow 合并/连接数组的方法
2018/07/27 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
python配置文件写入过程详解
2019/10/19 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
Tensorflow之梯度裁剪的实现示例
2020/03/08 Python
python实现贪吃蛇游戏源码
2020/03/21 Python
Keras load_model 导入错误的解决方式
2020/06/09 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
分享一个H5原生form表单的checkbox特效代码
2018/02/26 HTML / CSS
惠普加拿大在线商店:HP加拿大
2017/09/15 全球购物
九年级科学教学反思
2014/01/29 职场文书
市场营销调查计划书
2014/05/02 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
2015年清明节扫墓演讲稿
2015/03/18 职场文书
中秋节晚会开场白
2015/05/29 职场文书
MySQL分区以及建索引的方法总结
2022/04/13 MySQL