详解基于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中list初始化方法示例
Sep 18 Python
深入理解NumPy简明教程---数组1
Dec 17 Python
python使用opencv进行人脸识别
Apr 07 Python
详解flask表单提交的两种方式
Jul 21 Python
python 对类的成员函数开启线程的方法
Jan 22 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
May 15 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
Jun 25 Python
Pytorch中Tensor与各种图像格式的相互转化详解
Dec 26 Python
python批量处理txt文件的实例代码
Jan 13 Python
解决jupyter notebook 前面书写后面内容消失的问题
Apr 13 Python
django Model层常用验证器及自定义验证器详解
Jul 15 Python
python time()的实例用法
Nov 03 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中字符串和正则表达式详解
2014/10/23 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
JS 面向对象的5钟写法
2009/07/31 Javascript
面向对象的javascript(笔记)
2009/10/06 Javascript
Extjs中DisplayField的日期或者数字格式化扩展
2010/09/03 Javascript
jquery json 实例代码
2010/12/02 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
2013/12/23 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
2017/03/17 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
vue使用openlayers实现移动点动画
2020/09/24 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
matplotlib绘制多个子图(subplot)的方法
2019/12/03 Python
django自定义模板标签过程解析
2019/12/14 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
2021/01/29 Python
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
HTML5语义化元素你真的用对了吗
2019/08/22 HTML / CSS
amazeui模态框弹出后立马消失并刷新页面
2020/08/19 HTML / CSS
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
田径运动会开幕式及主持词
2014/03/28 职场文书
实习生评语
2014/04/26 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
党校党性分析材料
2014/12/19 职场文书
史上最牛辞职信
2015/05/13 职场文书
民事纠纷协议书
2016/03/23 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
2019新员工试用期转正工作总结范文
2019/08/21 职场文书
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang
Python常遇到的错误和异常
2021/11/02 Python
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL