午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > Django3基于WebSocket實現WebShell的詳細過程

Django3基于WebSocket實現WebShell的詳細過程

熱門標簽:地圖標注審核表 宿遷星美防封電銷卡 ai電銷機器人源碼 西藏房產智能外呼系統要多少錢 百度地圖標注沒有了 湛江智能外呼系統廠家 外呼并發線路 長沙高頻外呼系統原理是什么 ai電話機器人哪里好

前言

最近工作中需要開發前端操作遠程虛擬機的功能,簡稱WebShell. 基于當前的技術棧為react+django,調研了一會發現大部分的后端實現都是django+channels來實現websocket服務.
大致看了下覺得這不夠有趣,翻了翻django的官方文檔發現django原生是不支持websocket的,但django3之后支持了asgi協議可以自己實現websocket服務. 于是選定
gunicorn+uvicorn+asgi+websocket+django3.2+paramiko來實現WebShell.

實現websocket服務

使用django自帶的腳手架生成的項目會自動生成asgi.py和wsgi.py兩個文件,普通應用大部分用的都是wsgi.py配合nginx部署線上服務. 這次主要使用asgi.py
實現websocket服務的思路大致網上搜一下就能找到,主要就是實現 connect/send/receive/disconnect這個幾個動作的處理方法.
這里 How to Add Websockets to a Django App without Extra Dependencies 就是一個很好的實例
, 但過于簡單........:

思路

# asgi.py 
import os

from django.core.asgi import get_asgi_application
from websocket_app.websocket import websocket_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'websocket_app.settings')

django_application = get_asgi_application()


async def application(scope, receive, send):
    if scope['type'] == 'http':
        await django_application(scope, receive, send)
    elif scope['type'] == 'websocket':
        await websocket_application(scope, receive, send)
    else:
        raise NotImplementedError(f"Unknown scope type {scope['type']}")


# websocket.py
async def websocket_application(scope, receive, send):
    pass
# websocket.py
async def websocket_application(scope, receive, send):
    while True:
        event = await receive()

        if event['type'] == 'websocket.connect':
            await send({
                'type': 'websocket.accept'
            })

        if event['type'] == 'websocket.disconnect':
            break

        if event['type'] == 'websocket.receive':
            if event['text'] == 'ping':
                await send({
                    'type': 'websocket.send',
                    'text': 'pong!'
                })

實現

上面的代碼提供了思路,比較完整的可以參考這里 websockets-in-django-3-1 基本可以復用了
其中最核心的實現部分我放下面:

class WebSocket:
    def __init__(self, scope, receive, send):
        self._scope = scope
        self._receive = receive
        self._send = send
        self._client_state = State.CONNECTING
        self._app_state = State.CONNECTING

    @property
    def headers(self):
        return Headers(self._scope)

    @property
    def scheme(self):
        return self._scope["scheme"]

    @property
    def path(self):
        return self._scope["path"]

    @property
    def query_params(self):
        return QueryParams(self._scope["query_string"].decode())

    @property
    def query_string(self) -> str:
        return self._scope["query_string"]

    @property
    def scope(self):
        return self._scope

    async def accept(self, subprotocol: str = None):
        """Accept connection.
        :param subprotocol: The subprotocol the server wishes to accept.
        :type subprotocol: str, optional
        """
        if self._client_state == State.CONNECTING:
            await self.receive()
        await self.send({"type": SendEvent.ACCEPT, "subprotocol": subprotocol})

    async def close(self, code: int = 1000):
        await self.send({"type": SendEvent.CLOSE, "code": code})

    async def send(self, message: t.Mapping):
        if self._app_state == State.DISCONNECTED:
            raise RuntimeError("WebSocket is disconnected.")

        if self._app_state == State.CONNECTING:
            assert message["type"] in {SendEvent.ACCEPT, SendEvent.CLOSE}, (
                    'Could not write event "%s" into socket in connecting state.'
                    % message["type"]
            )
            if message["type"] == SendEvent.CLOSE:
                self._app_state = State.DISCONNECTED
            else:
                self._app_state = State.CONNECTED

        elif self._app_state == State.CONNECTED:
            assert message["type"] in {SendEvent.SEND, SendEvent.CLOSE}, (
                    'Connected socket can send "%s" and "%s" events, not "%s"'
                    % (SendEvent.SEND, SendEvent.CLOSE, message["type"])
            )
            if message["type"] == SendEvent.CLOSE:
                self._app_state = State.DISCONNECTED

        await self._send(message)

    async def receive(self):
        if self._client_state == State.DISCONNECTED:
            raise RuntimeError("WebSocket is disconnected.")

        message = await self._receive()

        if self._client_state == State.CONNECTING:
            assert message["type"] == ReceiveEvent.CONNECT, (
                    'WebSocket is in connecting state but received "%s" event'
                    % message["type"]
            )
            self._client_state = State.CONNECTED

        elif self._client_state == State.CONNECTED:
            assert message["type"] in {ReceiveEvent.RECEIVE, ReceiveEvent.DISCONNECT}, (
                    'WebSocket is connected but received invalid event "%s".'
                    % message["type"]
            )
            if message["type"] == ReceiveEvent.DISCONNECT:
                self._client_state = State.DISCONNECTED

        return message

縫合怪

做為合格的代碼搬運工,為了提高搬運效率還是要造點輪子填點坑的,如何將上面的WebSocket類與paramiko結合起來實現從前端接受字符傳遞給遠程主機并同時接受返回呢?

import asyncio
import traceback
import paramiko
from webshell.ssh import Base, RemoteSSH
from webshell.connection import WebSocket


class WebShell:
    """整理 WebSocket 和 paramiko.Channel,實現兩者的數據互通"""

    def __init__(self, ws_session: WebSocket,
                 ssh_session: paramiko.SSHClient = None,
                 chanel_session: paramiko.Channel = None
                 ):
        self.ws_session = ws_session
        self.ssh_session = ssh_session
        self.chanel_session = chanel_session

    def init_ssh(self, host=None, port=22, user="admin", passwd="admin@123"):
        self.ssh_session, self.chanel_session = RemoteSSH(host, port, user, passwd).session()

    def set_ssh(self, ssh_session, chanel_session):
        self.ssh_session = ssh_session
        self.chanel_session = chanel_session

    async def ready(self):
        await self.ws_session.accept()

    async def welcome(self):
        # 展示Linux歡迎相關內容
        for i in range(2):
            if self.chanel_session.send_ready():
                message = self.chanel_session.recv(2048).decode('utf-8')
                if not message:
                    return
                await self.ws_session.send_text(message)

    async def web_to_ssh(self):
        # print('--------web_to_ssh------->')
        while True:
            # print('--------------->')
            if not self.chanel_session.active or not self.ws_session.status:
                return
            await asyncio.sleep(0.01)
            shell = await self.ws_session.receive_text()
            # print('-------shell-------->', shell)
            if self.chanel_session.active and self.chanel_session.send_ready():
                self.chanel_session.send(bytes(shell, 'utf-8'))
            # print('--------------->', "end")

    async def ssh_to_web(self):
        # print('--------ssh_to_web-----------')
        while True:
            # print('-------------------')
            if not self.chanel_session.active:
                await self.ws_session.send_text('ssh closed')
                return
            if not self.ws_session.status:
                return
            await asyncio.sleep(0.01)
            if self.chanel_session.recv_ready():
                message = self.chanel_session.recv(2048).decode('utf-8')
                # print('---------message----------', message)
                if not len(message):
                    continue
                await self.ws_session.send_text(message)
            # print('-------------------', "end")

    async def run(self):
        if not self.ssh_session:
            raise Exception("ssh not init!")
        await self.ready()
        await asyncio.gather(
            self.web_to_ssh(),
            self.ssh_to_web()
        )

    def clear(self):
        try:
            self.ws_session.close()
        except Exception:
            traceback.print_stack()
        try:
            self.ssh_session.close()
        except Exception:
            traceback.print_stack()

前端

xterm.js 完全滿足,搜索下找個看著簡單的就行.

export class Term extends React.Component {
    private terminal!: HTMLDivElement;
    private fitAddon = new FitAddon();

    componentDidMount() {
        const xterm = new Terminal();
        xterm.loadAddon(this.fitAddon);
        xterm.loadAddon(new WebLinksAddon());

        // using wss for https
        //         const socket = new WebSocket("ws://" + window.location.host + "/api/v1/ws");
        const socket = new WebSocket("ws://localhost:8000/webshell/");
        // socket.onclose = (event) => {
        //     this.props.onClose();
        // }
        socket.onopen = (event) => {
            xterm.loadAddon(new AttachAddon(socket));
            this.fitAddon.fit();
            xterm.focus();
        }

        xterm.open(this.terminal);
        xterm.onResize(({ cols, rows }) => {
            socket.send("RESIZE>" + cols + "," + rows)
        });

        window.addEventListener('resize', this.onResize);
    }

    componentWillUnmount() {
        window.removeEventListener('resize', this.onResize);
    }

    onResize = () => {
        this.fitAddon.fit();
    }

    render() {
        return div className="Terminal" ref={(ref) => this.terminal = ref as HTMLDivElement}>/div>;
    }
}

好了,廢話不多少了,代碼我放這里了webshell 歡迎star/fork!

參考資料

webshell

django文檔

graphene-django文檔

django 異步視圖

websockets-in-django-3-1

How to Add Websockets to a Django App without Extra Dependencies

到此這篇關于Django3使用WebSocket實現WebShell的文章就介紹到這了,更多相關Django3實現WebShell內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Django websocket原理及功能實現代碼
  • 詳解Django3中直接添加Websockets方式
  • Django通過dwebsocket實現websocket的例子
  • 詳解Django-channels 實現WebSocket實例
  • Django使用Channels實現WebSocket的方法

標簽:寧夏 大同 林芝 南平 海南 漯河 普洱 盤錦

巨人網絡通訊聲明:本文標題《Django3基于WebSocket實現WebShell的詳細過程》,本文關鍵詞  Django3,基于,WebSocket,實現,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Django3基于WebSocket實現WebShell的詳細過程》相關的同類信息!
  • 本頁收集關于Django3基于WebSocket實現WebShell的詳細過程的相關信息資訊供網民參考!
  • 推薦文章
    97人人澡人人爽| 日韩a∨精品日韩在线观看| 在线观看欧美亚洲| 久久久精品一区| 亚洲一区美女视频在线观看免费| 超碰影院在线观看| 全部免费毛片在线播放一个| 精品久久国产97色综合| 国产一区不卡在线观看| 高h视频免费观看| 午夜精品久久久久久久96蜜桃| 性无码专区无码| 丰满熟妇人妻中文字幕| 处破女av一区二区| 亚洲一区精品在线| 亚洲视频一二三区| 欧美三电影在线| 成人综合国产精品| 国产精品12345| 手机在线视频一区| 日韩乱码一区二区| 中文字幕在线播放一区二区| 国产亚洲欧美日韩高清| 亚洲欧美日韩国产手机在线| 国产日韩欧美中文| 欧美日韩国产精品综合| 亚洲一区二区免费视频| 成人欧美一区二区三区黑人| 在线视频 日韩| 亚洲第一精品网站| 99久久久精品| 制服丝袜激情欧洲亚洲| 国产精品久久激情| 久久国产一区| 婷婷五月色综合| 国产乱码一区二区三区四区| 热久久免费视频| 国产丝袜在线精品| 在线亚洲午夜片av大片| 一区二区精品在线| 色视频一区二区三区| 午夜国产福利一区二区| 久久夜色精品国产欧美乱极品| 国产精品444| 日韩精品在线免费看| 欧美日韩成人高清| 男人用嘴添女人下身免费视频| 国产乱码精品一区二区| 天天综合日日夜夜精品| 亚洲欧美日韩图片| 午夜av免费看| 69久久夜色精品国产69乱青草| 国产免费一区二区三区最新不卡 | 国模精品一区二区三区色天香| 色琪琪综合男人的天堂aⅴ视频| 欧美下载看逼逼| 6080午夜伦理| 国产精品成人免费在线| 爽爽爽爽爽爽爽成人免费观看| 亚洲中国色老太| 久久综合久久久久| 国产无码精品在线观看| 亚洲精品一二三| 国产精品色视频| 久久中文免费视频| 成人午夜激情片| 毛片基地黄久久久久久天堂| 56国语精品自产拍在线观看| 成人免费淫片视频软件| 欧美黄色性生活| 精品人妻一区二区三区蜜桃视频| 天天综合永久入口| 55夜色66夜色国产精品视频| 黄色在线免费播放| 不卡一区二区在线| 久热爱精品视频线路一| 国产v综合ⅴ日韩v欧美大片| 国产精品jizz| 成人激情文学综合网| 成人久久一区二区三区| 国产绿帽一区二区三区| 欧美亚洲国产精品| ass极品国模人体欣赏| 色先锋aa成人| 久久久久天天天天| 国精产品一区一区| 成人动漫一区二区| 国语对白做受69| 国产一区二区在线观看免费视频| 中文字幕69页| 亚洲美女一区二区三区| 久久久久久欧美精品色一二三四| 亚洲欧美高清视频| 色综合久久精品| 久久久综合香蕉尹人综合网| 日韩精品 欧美| 国产精品久久久久久无人区| 91精品国产高清一区二区三区蜜臀 | 老司机免费视频一区二区| 国产在线精品自拍| 亚洲精品一区二区三区在线播放| 97久久超碰国产精品电影| 色阁综合伊人av| 99福利在线观看| av亚洲精华国产精华| 欧美巨乳在线观看| 99色这里只有精品| 国产手机av在线| 国产国产精品人在线视| 亚洲色偷偷综合亚洲av伊人| 亚洲综合偷拍欧美一区色| 亚洲精品一区二区三| 精品久久一二三| 国产激情精品久久久第一区二区| 亚洲影视九九影院在线观看| 精品一区二区三区在线观看| 亚洲成色最大综合在线| 国产精品久久久久久久久免费桃花| 不卡区在线中文字幕| 国产69精品久久久久久久久久 | 成人午夜视频在线观看免费| 欧美色视频一区二区三区在线观看| 日韩一区二区三区在线观看| 一区二区三区少妇| 99国产精品久久久久| 国内精品久久影院| 免费精品在线视频| 91热门视频在线观看| 美日韩丰满少妇在线观看| 中文字幕在线观看的网站| 91久久精品一区二区三区| 亚洲国产果冻传媒av在线观看| 中文字幕欧美在线| 91在线观看喷潮| 国产日韩综合一区二区性色av| 久久成人免费网| 91久久精品在线| 特级西西444www大胆免费看| 欧美成人三级电影在线| 久久久久中文字幕亚洲精品| 亚洲午夜久久久久久久久电影网 | 日韩欧美在线播放| 老司机精品福利在线观看| 亚洲av无码乱码在线观看性色| 高清一区二区三区四区五区| 国产成人黄色网址| 成人综合婷婷国产精品久久 | 成人免费视频97| 久久综合色婷婷| 激情 小说 亚洲 图片: 伦| 欧美在线高清视频| 免费黄色网址在线| 久久999免费视频| 少妇太紧太爽又黄又硬又爽| 精品少妇一区二区三区在线播放| 亚洲精品久久一区二区三区777| 亚洲另类一区二区| 国产一级黄色录像片| 亚洲爱情岛论坛永久| 日韩在线中文字| 日韩有码第一页| 亚洲春色在线视频| 手机在线观看毛片| 国产精品精品久久久| 熟妇人妻中文av无码| 在线中文字幕不卡| 中文字幕1234区| 欧美午夜无遮挡| 国产精品加勒比| 亚洲一区 视频| 亚洲永久免费av| 成人在线资源网址| 久久久久亚洲av无码专区体验| 中文字幕亚洲视频| 97福利一区二区| 免费在线观看污| 精品久久久国产| 2021亚洲天堂| 国产欧美精品日韩| 久久精品99北条麻妃| 欧美激情乱人伦一区| 国产有码在线观看| 久久全国免费视频| 欧美黄色免费观看| 免费91麻豆精品国产自产在线观看| 精品人妻一区二区色欲产成人| 日本三级中国三级99人妇网站| 欧美一区二区三区视频在线 | 欧美亚洲一区二区在线观看| 欧美日韩综合在线观看| 免费久久一级欧美特大黄| av中文字幕不卡| 亚洲mv在线看| 日本一区二区三区视频视频| 天堂中文视频在线| 日韩欧美亚洲另类制服综合在线 | 日本少妇做爰全过程毛片| 精品国产乱码久久久久久久| 国产一区二区99| 国产精品一码二码三码在线| 狠狠久久亚洲欧美| 国产成人永久免费视频| 欧美性感一类影片在线播放| 中文字幕在线免费看线人| 亚洲高清免费观看| 日韩成人短视频| 国产精品久久久久久久久| 亚洲综合一区二区精品导航| 老熟妇一区二区三区啪啪| 熟妇人妻va精品中文字幕| zzijzzij亚洲日本成熟少妇| 国产成人啪免费观看软件| 日韩丰满少妇无码内射| 久久综合色88| 美女精品自拍一二三四| 免费影院在线观看一区| 亚洲日本在线观看| 中文字幕人妻一区二区三区| 欧美精品久久久久久久| 日韩av网站在线观看| 日本精品一区二区三区在线播放视频| 亚洲黄色三级视频| 日韩亚洲欧美中文高清在线| 久久久国产高清| 久久久久在线观看| 大尺度一区二区| 手机av在线免费| 亚洲国产精品女人久久久| 无码人妻黑人中文字幕| 亚洲国产精品www| 欧美性生活久久| 另类的小说在线视频另类成人小视频在线| 亚洲国产av一区| 亚洲成人a**址| 久久视频国产精品免费视频在线| 久久免费国产精品| 欧美一级高潮片| 999视频在线免费观看| 亚洲男人都懂的| 国产麻豆xxxvideo实拍| 性欧美办公室18xxxxhd| 国产在线不卡一卡二卡三卡四卡| 精品久久久久久无码国产| 亚洲精品国精品久久99热| 男人晚上看的视频| 美乳少妇欧美精品| 国产手机av在线| 久久久久久久久久码影片| 国产日韩综合av| 亚洲av无码一区二区三区在线| 亚洲一区二区中文字幕| 国产精品美女一区二区三区| 中文字幕天堂av| 成人网在线观看| 51精品视频一区二区三区| 99国产精品久久久久久久久久久| 亚洲综合精品国产一区二区三区 | 欧美不卡一区二区| 东方aⅴ免费观看久久av| 国产精品区一区二区三含羞草| 色综合亚洲欧洲| 国产精品100| 黑人巨大国产9丨视频| 精品国产髙清在线看国产毛片| 欧美自拍偷拍第一页| 欧美视频第三页| 中文字幕亚洲一区在线观看| 国内av在线播放| 免费成人看片网址| 亚洲va在线va天堂| 久久久久久久九九九九| 国产欧美一区二区三区久久人妖| 色屁屁一区二区| 亚洲欧美综合一区二区| 性猛交╳xxx乱大交| 日韩av123| 在线亚洲人成电影网站色www| 亚洲精品无amm毛片| 国产高潮流白浆| 日韩中文字幕a| 中文字幕久精品免| 3d精品h动漫啪啪一区二区| 欧美精品精品精品精品免费| 91精品国产色综合久久ai换脸| 亚洲免费av网站| 精品国产av鲁一鲁一区| 在线观看免费看片| 91一区二区三区| 亚洲精品久久久久久久久久久久久 | 最新黄色av网站| 精品视频在线播放| 三级在线观看一区二区| 亚洲天堂国产视频| 欧美中文字幕第一页| 国产精品视频你懂的| 69xx绿帽三人行| 日本在线xxx| 热99精品只有里视频精品| 91国产成人在线| 蜜桃久久精品一区二区| 久久狠狠高潮亚洲精品| 一区二区三区国产免费| mm131午夜| 300部国产真实乱| 日本在线播放一区| 欧美精品在线一区| 91精品国产自产在线观看永久| 欧美成人精品h版在线观看| 日韩精品一区在线观看| 亚洲h在线观看| 97超视频在线观看| 免费观看成人网| 国产欧美一区二区白浆黑人| 亚洲精品在线免费观看视频| 97精品电影院| 69视频免费看| 亚洲专区区免费| 在线精品日韩| 日韩欧美一级二级三级| 国产成人8x视频一区二区| 色婷婷国产精品免| 无遮挡亚洲一区| 欧美巨乳在线观看| 精品国产91久久久久久| 99精品在线观看视频| 精品欧美一区二区精品少妇| 久久免费黄色网址| 国产精品免费观看久久| 欧美日韩精品久久久免费观看| 久久国产天堂福利天堂| 欧美午夜女人视频在线| 亚洲综合成人在线视频| 欧美日韩美女在线观看| 欧美日韩精品在线播放| 亚洲国产成人精品视频| 欧美性xxxx| 日韩一区二区视频在线观看| 欧美不卡激情三级在线观看| 亚洲国产成人精品电影| 一区二区免费看| 91麻豆精品秘密| 久久电影国产免费久久电影| 国产性猛交普通话对白| 男人添女人荫蒂国产| 成年人网站免费视频| 亚洲国产日韩欧美| 国产亚洲欧美一区二区| 欧美片一区二区三区| 欧美一区二区三区电影| 91在线高清观看| 中文字幕乱伦视频| 色欲av无码一区二区三区| 国产精品宾馆在线精品酒店| 久久99精品久久久水蜜桃| 久久久久久久国产精品| 美女av一区二区三区| 亚洲精品成人久久| 在线亚洲一区观看| 国产精品美女久久久久久久| 91在线porny国产在线看| 午夜在线观看视频18| 99久久精品无免国产免费| 亚洲欧美一区二区三区在线观看 | 7777精品伊人久久久大香线蕉完整版 | 国产精品 欧美激情| 天天干天天操天天玩| 一本久道中文无码字幕av| 欧美老熟妇喷水| 国产亚洲欧美另类一区二区三区| 久久这里有精品视频| 日韩国产精品视频| 欧美精品日韩一区| 天天操天天色综合| 欧美激情一区二区三区不卡| 丰满人妻av一区二区三区| 在线免费a视频| 欧美精品亚洲精品日韩精品| 久久久精品视频免费| 国产成人精品无码片区在线| 国产成年人视频网站| 91视频免费入口| 日韩精品你懂的| 欧美日韩久久婷婷| xxxxxx国产| 神马午夜电影一区二区三区在线观看| 国产成人午夜片在线观看高清观看| 中文字幕一区在线| 欧美二区在线观看| 日韩最新av在线| 亚洲va男人天堂| 亚洲激情图片| 日本福利视频在线| 国产精品一区二区小说| 欧美熟妇精品一区二区蜜桃视频| 免费看黄色片的网站| 99视频在线观看视频| 国产全是老熟女太爽了| 一级在线观看视频| 亚洲天堂黄色片| 在线观看亚洲国产| 丰满少妇xoxoxo视频| 亚洲精品国产精品国自产网站按摩| 日本熟妇毛茸茸丰满| 日韩特黄一级片| 中文字幕精品三级久久久| av中文字幕免费在线观看| 国产清纯白嫩初高生在线观看91| 在线免费观看视频一区| 欧美丰满少妇xxxxx高潮对白| 精品国产一区二区精华|