成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > Django3基于WebSocket實現(xiàn)WebShell的詳細過程

Django3基于WebSocket實現(xiàn)WebShell的詳細過程

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

前言

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

實現(xiàn)websocket服務(wù)

使用django自帶的腳手架生成的項目會自動生成asgi.py和wsgi.py兩個文件,普通應(yīng)用大部分用的都是wsgi.py配合nginx部署線上服務(wù). 這次主要使用asgi.py
實現(xiàn)websocket服務(wù)的思路大致網(wǎng)上搜一下就能找到,主要就是實現(xiàn) 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!'
                })

實現(xiàn)

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

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結(jié)合起來實現(xiàn)從前端接受字符傳遞給遠程主機并同時接受返回呢?

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


class WebShell:
    """整理 WebSocket 和 paramiko.Channel,實現(xiàn)兩者的數(shù)據(jù)互通"""

    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歡迎相關(guān)內(nèi)容
        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

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

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標題《Django3基于WebSocket實現(xiàn)WebShell的詳細過程》,本文關(guān)鍵詞  Django3,基于,WebSocket,實現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Django3基于WebSocket實現(xiàn)WebShell的詳細過程》相關(guān)的同類信息!
  • 本頁收集關(guān)于Django3基于WebSocket實現(xiàn)WebShell的詳細過程的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产一区二区av| 久久青草欧美一区二区三区| 国产又粗又猛大又黄又爽| 亚洲一二三四五| 成年视频在线观看| 午夜国产不卡在线观看视频| 久久精品一区二区三区不卡牛牛| 一级免费a一片| 九九热精品视频国产| www精品国产| 91夜夜揉人人捏人人添红杏| 午夜国产精品影院在线观看| 成年人在线看片| 超在线视频97| 欧美一级淫片a免费视频| 亚洲欧美中文字幕在线观看| 中文字幕在线日韩| 在线观看毛片av| 欧美电影免费网站| 日韩欧美在线观看一区二区三区| 91精品人妻一区二区三区蜜桃欧美| 国产不卡高清在线观看视频| 日本高清不卡的在线| 午夜精品久久99蜜桃的功能介绍| 免费观看黄网站| 2020色愉拍亚洲偷自拍| 99视频在线免费| 97在线播放视频| 欧美激情欧美激情在线五月| 日韩欧美国产另类| 蜜乳av一区二区| 亚洲精品一二三四| av动漫精品一区二区| 四虎永久在线精品免费一区二区| 一区二区三区免费高清视频| 性欧美videosex高清少妇| 欧美成人免费全部观看天天性色| 日本精品免费| 日日摸夜夜添夜夜添国产精品| 日韩欧美在线观看一区二区| 国产一区二区三区站长工具| 中国女人一级一次看片| 综合激情一区| 国产午夜精品一区二区三区四区| 国内av免费观看| 91香蕉视频污在线| 精品极品三级久久久久| 欧美一级片在线视频| 国产成人精品免费视频大全最热| 亚洲一卡二卡三卡四卡无卡网站在线看| 国产午夜精品一区二区三区欧美| 亚洲一区日韩精品| 国产精品无码午夜福利| 欧美一级淫片007| 国产免费观看久久黄| 中文字幕制服丝袜成人av| 先锋影音av在线| 日本黄色一级网站| 精品国产18久久久久久洗澡| jizz在亚洲| 亚洲欧美激情在线观看| 日韩av无码中文字幕| 大胆欧美人体视频| 亚洲三级电影在线观看| 欧美午夜在线一二页| 久久不见久久见中文字幕免费| 欧美电影影音先锋| 中文字幕乱在线伦视频乱在线伦视频| 日本激情视频网站| 欧美顶级xxxxbbbb| 91视频国产精品| 日本男人操女人| 午夜激情电影在线播放| 精品一区二区三区的国产在线观看| 欧美成a人免费观看久久| 国产高清在线看| 亚洲精品国产一区黑色丝袜| 亚洲精品视频在线看| 国产毛片久久| 亚洲精品一区三区三区在线观看| 久久久久成人精品免费播放动漫| 国产女人爽到高潮a毛片| 免费观看特级毛片| 涩涩视频在线播放| 曰皮视频在线播放免费的| 色哟哟一一国产精品| 99国产精品免费网站| 午夜国产福利在线| 狠狠v欧美v日韩v亚洲ⅴ| 午夜dj在线观看高清视频完整版| 五月亚洲婷婷| 国产一区二区三区四区hd| 日本一区二区免费在线观看视频| 国产裸体舞一区二区三区| 萌白酱国产一区二区| 日韩黄色免费网站| 97久久视频| 日韩成人18| 久久久亚洲精品视频| 国产午夜精品一区二区三区四区| 午夜精品免费在线| 精品人妻一区二区三区潮喷在线| 国产精品最新在线观看| 精品亚洲aⅴ无码一区二区三区| 久久人人97超碰人人澡爱香蕉| 亚洲成人av观看| 青青草中文字幕| 女厕盗摄一区二区三区| 亚洲成人性视频| 一区二区三区美女视频| 国产日韩欧美在线一区| 91成人在线看| 三级在线观看视频| 国产又大又粗又长| www日韩精品| 成人av网站免费观看| 91网站免费视频| 免费看av成人| 欧美黑人经典片免费观看| 成人在线app| 国产女主播喷水视频在线观看| 国产精品一品二品| 国产免费不卡| 国产精品午夜av在线| 美女福利一区| 韩国精品一区| 亚洲素人一区二区| 欧美精品一区二区三区很污很色的| 亚洲国内自拍| 性欧美最新另类| 欧美野外多人交3| 欧美一区二区三区日韩视频| 日日干夜夜爽| 亚洲女人天堂视频| 538任你躁精品视频网免费| 久久久蜜桃一区二区人| 国产在线观看无码免费视频| 国产一区二区精品在线观看| 一区二区日本| 少妇高潮久久久久久潘金莲| 国产区在线观看| 精品国产午夜福利在线观看| 国产国语亲子伦亲子| 日韩欧美在线看| 亚洲黄色免费电影| 国语对白在线视频| 日本中文字幕视频一区| 色婷婷一区二区三区av免费看| 日本熟妇一区二区| av在线综合网| 欧美私人啪啪vps| 超薄肉色丝袜一二三| 97国产一区二区| 久久久人成影片一区二区三区观看| 国产美女精品一区二区三区| 日本一二三不卡视频| 亚洲a在线观看| 中文字幕日韩av电影| 国产精品扒开腿做爽爽| eeuss影院在线| 黄色污污网站在线观看| 日韩成人三级视频| 日本黄色精品| 在线亚洲美日韩| 欧美日韩一区二区三区在线电影| 欧美日韩精品不卡| 国产网站无遮挡| 欧美日韩亚洲国产精品| 日韩123区| 韩日精品视频| 日韩av一区二区三区美女毛片| 日本视频www| 97超碰人人模人人爽人人看| 久久精品一区二区三| 亚洲图区欧美| 亚洲午夜一二三区视频| 欧美人成在线观看| 四虎影视亚洲| 日产亚洲一区二区三区| 黄视频在线观看免费| 日本黑人久久| 成人91在线| 天美传媒免费在线观看| 久久精品无码中文字幕| 久久久这里只有精品视频| 欧洲亚洲妇女av| 国产亚洲一区二区手机在线观看| 国产精品系列在线| 亚洲综合av影视| 欧美黑人精品一区二区不卡| 欧美 变态 另类 人妖| 亚洲国产精品推荐| 欧美一区二区三区系列电影| 人九九综合九九宗合| 亚洲啪啪综合av一区二区三区| 天天影视涩香欲综合网| 在线男人天堂| 日韩免费观看高清完整版在线观看| 欧美日韩国产精品一区| 亚洲女优在线| 激情文学综合| 色综合色综合色综合色综合| 三级全黄的视频在线观看| 韩国xxxx做受gayxxxx| 在线观看成年人网站| 日韩在线高清视频| 日本最新中文字幕| 中文字幕日韩精品久久| 伊人狠狠色丁香综合尤物| 青青草原网站在线观看| 成年网站免费| 日本最新一区二区三区视频观看| 亚洲黄色免费电影| 欧美性淫爽ww久久久久无| 成人免费观看a| 一本久中文高清| 一本久道综合久久精品| 欧美一区二区在线观看视频| 99re热久久这里只有精品34| 日韩美香港a一级毛片| 国产精品丝袜久久久久久app| 久久久久人妻一区精品色欧美| 中文字幕中文字幕一区| 欧美一区二区三区精品电影| 偷拍精品精品一区二区三区| 日本久久黄色| 红桃视频一区二区三区免费| 欧美日韩精品在线观看| av免费在线免费观看| 国产亚洲一区二区三区在线观看| 欧美一区在线直播| 污网站免费观看| 小水嫩精品福利视频导航| xxxx69视频| 欧美深性狂猛ⅹxxx深喉| 国产在线观看免费| 国产精品成人一区二区不卡| 成人久久一区二区三区| 久草在线免费资源站| 日韩精品一区二区亚洲av性色| 欧美性猛交xxx乱大交3蜜桃| 国产又粗又猛又爽又黄的视频一| 国产麻豆精品一区二区| 成人做爰免费视频免费看| 免费91视频| av电影天堂一区二区在线观看| 91热视频在线观看| 伊人激情综合| 欧美性高清videossexo| 亚洲女成人图区| 国产美女免费网站| 日韩欧美激情在线| 欧美成人综合在线| 免费黄视频在线观看| 精品无线一线二线三线| 免费国产a级片| 久久久美女毛片| 一本加勒比北条麻妃| 久久香蕉国产线看观看网| 欧美一级特黄a| 欧美mv日韩mv国产网站app| 国产白袜脚足j棉袜在线观看| 国产精品1区2区3区| 久久免费播放视频| 亚洲精品久久久久久久久久久久久| 日本中文字幕在线一区| 亚洲狼人国产精品| 久久久久亚洲av片无码v| 国产精品18久久久久久久久久久久| 欧美图片欧美激情欧美精品| 四虎国产成人精品免费一女五男| 精品一区二区在线视频| 久久成人免费视频| 色狠狠综合天天综合综合| 亚洲精品一区二区三区香蕉| 国产精品久久无码| 日韩成人在线电影网| 美女网站视频在线观看| 日本久久综合网| 欧美久久久久久久久久久久久| 播金莲一级淫片aaaaaaa| 国产女主播在线| 日韩精彩视频在线观看| 成人免费在线观看入口| 日本xxxxwwww| 国产不卡高清在线观看视频| 最近2019中文字幕在线高清| 国产精品入口尤物| 3d精品h动漫啪啪一区二区| 欧美 日韩 精品| 欧美一级午夜免费电影| 国产精品网址| 邻居大乳一区二区三区| 国内精品伊人久久久久av一坑| 亚洲理论电影在线观看| 国产情侣在线播放| 日本a级片久久久| 最近日韩中文字幕中文| 国产精品一区二区久久国产| 无码人妻aⅴ一区二区三区日本| 91精品人妻一区二区三区四区| 一区二区三区在线观看动漫| 91免费国产精品| 精品午夜久久| 亚洲精品一区二区在线| 亚洲久久久久久久| 天天色天天综合| 影音先锋中文一区| 亚洲女优在线观看| 小视频福利在线| 国产伦精品一区二区三区视频青涩| 亚洲影院色在线观看免费| 红桃视频 国产| 99亚洲一区二区| 国产一区二区免费电影| 久久久久久国产精品| 日本视频网站在线观看| 国产91色在线免费| 久久艹国产精品| 久久国产精品亚洲| 久久国产精品视频在线观看| 国产精品suv一区二区88| 黄色a在线观看| 亚洲美女15p| www国产亚洲精品久久麻豆| 国产iv一区二区三区| 日韩一区二区av| 91精品福利视频|