详解基于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自动格式化json文件的方法
Mar 11 Python
python通过pil为png图片填充上背景颜色的方法
Mar 17 Python
Python中shape计算矩阵的方法示例
Apr 21 Python
python类的方法属性与方法属性的动态绑定代码详解
Dec 27 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
Jan 09 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
Python中super函数用法实例分析
Mar 18 Python
利用rest framework搭建Django API过程解析
Aug 31 Python
Python 字符串、列表、元组的截取与切片操作示例
Sep 17 Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 Python
PyCharm无法引用自身项目解决方式
Feb 12 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 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经典面试题之设计模式(经常遇到)
2015/10/15 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
扩展Jquery插件处理mouseover时内部有子元素时发生样式闪烁
2011/12/08 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
jQuery实现简单隔行变色的方法
2016/02/20 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
AngularJS基础 ng-class-odd 指令示例
2016/08/01 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
webpack4 SplitChunks实现代码分隔详解
2019/05/23 Javascript
微信小程序实现分享商品海报功能
2019/09/30 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
Vue中key的作用示例代码详解
2020/06/10 Javascript
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python列表推导式的使用方法
2013/11/21 Python
Python编程argparse入门浅析
2018/02/07 Python
利用Python正则表达式过滤敏感词的方法
2019/01/21 Python
python多线程并发及测试框架案例
2019/10/15 Python
Python cookie的保存与读取、SSL讲解
2020/02/17 Python
Django调用百度AI接口实现人脸注册登录代码实例
2020/04/23 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
htmlentities() 和 htmlspecialchars()有什么区别
2015/07/01 面试题
社区工作者先进事迹
2014/01/18 职场文书
调查研究项目计划书
2014/04/29 职场文书
安全横幅标语
2014/06/09 职场文书
员工试用期自我评价
2014/09/18 职场文书
2014年科普工作总结
2014/12/06 职场文书
生日宴会祝酒词
2015/08/10 职场文书
MySQL8.0.24版本Release Note的一些改进点
2021/04/22 MySQL
Java实现多线程聊天室
2021/06/26 Java/Android
springboot中的pom文件 project报错问题
2022/01/18 Java/Android
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python