Djangoはchanls/mikoに基づいてwebsshオンラインサーバ管理を実現する


Webshell
Webの意味は明らかにサーバがウェブサービスを開放する必要があり、shellの意味はサーバに対してある程度の操作権限を取得することである.Webshellは、ウェブサイトポートを介してウェブサイトサーバをある程度操作する権限と呼ばれることが多い.
一方,webshellはサイト管理,サーバ管理などに駅長がよく用いられるが,FSO権限によっては,Webスクリプトのオンライン編集,ダウンロードファイルのアップロード,データベースの表示,任意のプログラムコマンドの実行などが機能する.
一方,侵入者に利用され,ウェブサイトサーバを制御する目的を達成する.これらのウェブスクリプトはよくWEBスクリプト木馬と呼ばれ、比較的流行しているaspやphp木馬にも基づいている.NETのシナリオ木馬とJSPのシナリオ木馬.国内でよく使われるWebShellには海陽ASP木馬、Phpspy、c 99 shellなどがあります.web端は、Xterm.jsまたは他のWebShell組立体およびwebsocketを使用する
バックエンドは、WebSocketおよびSSHプロトコルをサポートするリモートログインモジュールのみでよい
Webエンドの実装
1.インストールnpm install [email protected] --save指定バージョンインストール、最新版xtermファイルの変更が大きく、次の方法でエラーが発生します.
2.ガイドパック
import 'xterm/dist/xterm.css';
//            ,     terminal         textarea    
import {
      Terminal } from 'xterm';
import * as fit from 'xterm/lib/addons/fit/fit';
import * as attach from 'xterm/lib/addons/attach/attach'
Terminal.applyAddon(fit);
Terminal.applyAddon(attach);

3.ページでの表示
<template>
    <div>
        <div id="terminal" style="width: 500px;height:300px;"></div>
    </div>
</template>

4.データ操作
mounted () {
     
		let terminalContainer = document.getElementById('terminal')
        //  xterm  
        this.term = new Terminal({
     
        cursorBlink: true, //     
        cursorStyle: "underline" //     
        })                     //       Terminal  
        this.term.open(terminalContainer)              //  term   dom   
        
        console.log(this.term)
        // xterm          (    )
        this.term.write("$ ")
        //  xterm     
        this.term.on("key",(key,ev)=>{
     
            //key      ,ev        
            console.log('key======',ev.keyCode);
            //              
            this.term.write(key)
            if (ev.keyCode == 13) {
      //    (ASCII 13   )
                this.terminalSocket.send(this.order) //       
                // this.order = ''
                console.log('   order',this.order)
            }else if (ev.keyCode == 8) {
      //    (ASCII 8   )
                this.order = this.order.substr(0,this.order.length - 1)
                //         
                this.term.write("\x1b[2K\r")
                //        ,       
                this.term.write("$ "+this.order)
                console.log("      :"+this.order)
                typeof this.order
            }else{
       //             
                this.order += key   
                console.log("   order",this.order)
            }
        })
    	//     websocket,   django  
        this.terminalSocket = new WebSocket("ws://127.0.0.1:8000/webssh/");
        //          
        this.terminalSocket.onmessage = (res) => {
     
            console.log(res.data);
            // var message = JSON.parse(res.data);
            //          xterm 
            this.term.writeln("\r
"
+res.data); // this.order = "" // , this.term.write("\r
$ "
); } },

5.webエンドの完全なコード
<template>
  <div class="console" id="terminal"></div>
</template>
<script>
    import {
      Terminal } from 'xterm'
    import * as attach from 'xterm/lib/addons/attach/attach'
    import * as fit from 'xterm/lib/addons/fit/fit'
  export default {
     
    name: 'webssh',
    data () {
     
      return {
     
        
        term: null,
        terminalSocket: null,
        order:''
      }
    },
    methods: {
     
      
      
    },
    mounted () {
     
		let terminalContainer = document.getElementById('terminal')
        //  xterm  
        this.term = new Terminal({
     
        cursorBlink: true, //     
        cursorStyle: "underline" //     
        })                     //       Terminal  
        this.term.open(terminalContainer)              //  term   dom   
        
        console.log(this.term)
        // xterm          (    )
        this.term.write("$ ")
        //  xterm     
        this.term.on("key",(key,ev)=>{
     
            //key      ,ev        
            console.log('key======',ev.keyCode);
            //              
            this.term.write(key)
            if (ev.keyCode == 13) {
      //    (ASCII 13   )
                this.terminalSocket.send(this.order) //       
                // this.order = ''
                console.log('   order',this.order)
            }else if (ev.keyCode == 8) {
      //    (ASCII 8   )
                this.order = this.order.substr(0,this.order.length - 1)
                //         
                this.term.write("\x1b[2K\r")
                //        ,       
                this.term.write("$ "+this.order)
                console.log("      :"+this.order)
                typeof this.order
            }else{
       //             
                this.order += key   
                console.log("   order",this.order)
            }
        })
    	//     websocket,   django  
        this.terminalSocket = new WebSocket("ws://127.0.0.1:8000/webssh/");
        //          
        this.terminalSocket.onmessage = (res) => {
     
            console.log(res.data);
            // var message = JSON.parse(res.data);
            //          xterm 
            this.term.writeln("\r
"
+res.data); // this.order = "" // , this.term.write("\r
$ "
); } }, }, } </script>

サーバ側実装
1.インストールpip install paramiko
2.paramikoによるsshリモート登録
import paramiko

#   SSH   
client = paramiko.SSHClient()
# SSH   Host  ,         Known_host      。
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# SSH       
client.connect(
    hostname="192.168.000.000",
    port=22,
    username='root',
    password='123123'
)
# stdout      ,stderr     ,               
stdin, stdout, stderr = client.exec_command("ls")

#   ls     
print(stdout.read().decode('utf-8'))

3.websocketと連携してリアルタイム操作を実現
#wsserver.py
from channels.generic.websocket import WebsocketConsumer
import paramiko
class WebSSHService(WebsocketConsumer):

    def connect(self):
        self.accept()
        self.sh = paramiko.SSHClient()  # 1   SSH  
        self.sh.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 2       know_hosts      
        self.sh.connect("192.168.000.000",
        port=22, 
        username="root", 
        password="123123")  # 3      
        print("    ")

    def receive(self, text_data=None, bytes_data=None):
        print(str(text_data))  #        
        print(type(text_data))

        stdin, stdout, stderr = self.sh.exec_command(text_data)

        right_info = stdout.read()
        err_info = stderr.read()
        print(right_info)

        if right_info:
            new_data = right_info.decode("utf-8").replace("
"
,"\r
"
) print(new_data) self.send(new_data) elif err_info: new_data = err_info.decode("utf-8").replace("
"
, "\r
"
) print(new_data) self.send(new_data) else: print(self.send(" ")) def disconnect(self, code): print(f'sorry,{self}, , !')