详解基于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 自动化表单提交实例代码
Jun 08 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
Jun 12 Python
python使用 HTMLTestRunner.py生成测试报告
Oct 20 Python
python3使用SMTP发送HTML格式邮件
Jun 19 Python
python去除拼音声调字母,替换为字母的方法
Nov 28 Python
python用线性回归预测股票价格的实现代码
Sep 04 Python
命令行运行Python脚本时传入参数的三种方式详解
Oct 11 Python
Python collections中的双向队列deque简单介绍详解
Nov 04 Python
解决Jupyter NoteBook输出的图表太小看不清问题
Apr 16 Python
Python爬虫headers处理及网络超时问题解决方案
Jun 19 Python
pycharm无法导入lxml的解决办法
Mar 31 Python
Python使用Kubernetes API访问集群
May 30 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 字符串函数收集
2010/03/29 PHP
PHP使用in_array函数检查数组中是否存在某个值
2015/03/25 PHP
[原创]php简单隔行变色功能实现代码
2016/07/09 PHP
php解析xml 的四种简单方法(附实例)
2016/07/11 PHP
PHP获取客户端及服务器端IP的封装类
2016/07/21 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
Yii2.0建立公共方法简单示例
2019/01/29 PHP
浅谈tudou土豆网首页图片延迟加载的效果
2010/06/23 Javascript
JS俄罗斯方块,包含完整的设计理念
2010/12/11 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
2014/09/04 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
javascript数据类型验证方法
2015/12/31 Javascript
深入理解js generator数据类型
2016/08/16 Javascript
ionic组件ion-tabs选项卡切换效果实例
2016/08/27 Javascript
AngularJs  unit-testing(单元测试)详解
2016/09/02 Javascript
JavaScript数组去重的几种方法效率测试
2016/10/23 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
jQuery选择器之基本过滤选择器用法实例分析
2019/02/19 jQuery
详解在React-Native中持久化redux数据
2019/05/22 Javascript
微信小程序登陆注册功能的实现代码
2019/12/10 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
Python 爬虫爬取指定博客的所有文章
2016/02/17 Python
Python代码实现KNN算法
2017/12/20 Python
对python中的pop函数和append函数详解
2018/05/04 Python
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
2019/08/29 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
keras 获取某层输出 获取复用层的多次输出实例
2020/05/23 Python
Python API 操作Hadoop hdfs详解
2020/06/06 Python
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
党支部特色活动方案
2014/08/20 职场文书
员工工作能力评语
2014/12/31 职场文书
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis
Pandas搭配lambda组合使用详解
2022/01/22 Python