详解基于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中的XML 工具
Apr 13 Python
Python实现简单HTML表格解析的方法
Jun 15 Python
TensorFlow实现随机训练和批量训练的方法
Apr 28 Python
python3 对list中每个元素进行处理的方法
Jun 29 Python
python基于SMTP协议发送邮件
May 31 Python
django的auth认证,authenticate和装饰器功能详解
Jul 25 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
Feb 21 Python
python爬虫开发之urllib模块详细使用方法与实例全解
Mar 09 Python
使用python从三个角度解决josephus问题的方法
Mar 27 Python
python Tornado框架的使用示例
Oct 19 Python
Python操作Excel的学习笔记
Feb 18 Python
Python使用tkinter实现小时钟效果
Feb 22 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
Search Engine Friendly的URL设计
2006/10/09 PHP
PHP封装分页函数实现文本分页和数字分页
2014/10/23 PHP
PHP中的事务使用实例
2015/05/26 PHP
php实现点击可刷新验证码
2015/11/07 PHP
js中eval()函数和trim()去掉字符串左右空格应用
2013/02/02 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
angularjs学习笔记之简单介绍
2015/09/26 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
js实现简单计算器
2015/11/22 Javascript
jQuery实现的鼠标经过时变宽的效果(附demo源码)
2016/04/28 Javascript
Angular 4依赖注入学习教程之ClassProvider的使用(三)
2017/06/04 Javascript
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
基于Vue的ajax公共方法(详解)
2018/01/20 Javascript
详解Vue开发微信H5微信分享签名失败问题解决方案
2018/08/09 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
2019/11/01 Javascript
jQuery 移除事件的方法
2020/06/20 jQuery
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
python循环监控远程端口的方法
2015/03/14 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
Python连接mysql数据库的正确姿势
2016/02/03 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
2018/08/03 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
使用python创建Excel工作簿及工作表过程图解
2020/05/27 Python
Django如何批量创建Model
2020/09/01 Python
中医专业应届生求职信
2013/11/17 职场文书
护理学专业推荐信
2013/12/03 职场文书
小学岗位竞聘方案
2014/01/22 职场文书
法人任命书范本
2014/06/04 职场文书
入股合作协议书
2014/10/12 职场文书
退休欢送会主持词
2015/07/01 职场文书
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript