详解基于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实现的简单文件传输服务器和客户端
Apr 08 Python
Python黑魔法Descriptor描述符的实例解析
Jun 02 Python
Python命令行解析模块详解
Feb 01 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
详解Django中间件的5种自定义方法
Jul 26 Python
pandas中apply和transform方法的性能比较及区别介绍
Oct 30 Python
python pygame实现五子棋小游戏
Oct 26 Python
python实现递归查找某个路径下所有文件中的中文字符
Aug 31 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
Oct 28 Python
TensorFlow实现打印每一层的输出
Jan 21 Python
Python爬虫scrapy框架Cookie池(微博Cookie池)的使用
Jan 13 Python
使用Python封装excel操作指南
Jan 29 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
星际争霸 Starcraft 秘技补丁
2020/03/14 星际争霸
解析php常用image图像函数集
2013/06/24 PHP
PHP字符串word末字符实现大小写互换的方法
2014/11/10 PHP
php socket通信(tcp/udp)实例分析
2016/02/14 PHP
Laravel 5.3 学习笔记之 安装
2016/08/28 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
JavaScript获取GridView中用户点击控件的行号,列号
2009/04/14 Javascript
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
在jQuery1.5中使用deferred对象 着放大镜看Promise
2011/03/12 Javascript
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
2012/09/30 Javascript
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
基于JavaScript实现随机颜色输入框
2016/12/10 Javascript
jQuery实现的简单无刷新评论功能示例
2017/11/08 jQuery
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
javascript实现抢购倒计时程序
2019/08/26 Javascript
Django发送html邮件的方法
2015/05/26 Python
详解Python 数据库 (sqlite3)应用
2016/12/07 Python
python如何实现内容写在图片上
2018/03/23 Python
python使用pygame框架实现推箱子游戏
2018/11/20 Python
python多线程抽象编程模型详解
2019/03/20 Python
python中append实例用法总结
2019/07/30 Python
python ftplib模块使用代码实例
2019/12/31 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
2020/07/13 Python
pytorch 计算Parameter和FLOP的操作
2021/03/04 Python
档案管理员岗位职责
2013/12/01 职场文书
派出所所长先进事迹
2014/05/19 职场文书
企业负责人任命书
2014/06/05 职场文书
十佳家长事迹材料
2014/08/26 职场文书
领导干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
单位委托书
2014/10/15 职场文书
于丹论语心得观后感
2015/06/15 职场文书
python实现大文本文件分割成多个小文件
2021/04/20 Python
Redis Cluster集群动态扩容的实现
2021/07/15 Redis