diff --git a/class/core/ssh_local.py b/class/core/ssh_local.py new file mode 100644 index 000000000..f1e3296a9 --- /dev/null +++ b/class/core/ssh_local.py @@ -0,0 +1,120 @@ +# coding: utf-8 + +# --------------------------------------------------------------------------------- +# MW-Linux面板 +# --------------------------------------------------------------------------------- +# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved. +# --------------------------------------------------------------------------------- +# Author: midoks +# --------------------------------------------------------------------------------- + +# --------------------------------------------------------------------------------- +# SSH终端操作 +# --------------------------------------------------------------------------------- + +import json +import time +import os +import sys +import socket +import threading +import re + +from io import BytesIO, StringIO + +import mw +import paramiko + +from flask_socketio import SocketIO, emit, send + + +class ssh_local(object): + + __debug_file = 'logs/ssh_local.log' + __log_type = 'SSH终端' + + __ssh = None + + # lock + _instance_lock = threading.Lock() + + def __init__(self): + pass + + @classmethod + def instance(cls, *args, **kwargs): + if not hasattr(ssh_terminal, "_instance"): + with ssh_terminal._instance_lock: + if not hasattr(ssh_terminal, "_instance"): + ssh_terminal._instance = ssh_terminal(*args, **kwargs) + return ssh_terminal._instance + + def debug(self, msg): + msg = "{} - {}:{} => {} \n".format(mw.formatDate(), + self.__host, self.__port, msg) + if not mw.isDebugMode(): + return + mw.writeFile(self.__debug_file, msg, 'a+') + + def returnMsg(self, status, msg): + return {'status': status, 'msg': msg} + + + def connectSsh(self): + import paramiko + ssh = paramiko.SSHClient() + createSshInfo() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + + port = getSSHPort() + try: + ssh.connect('127.0.0.1', port, timeout=5) + except Exception as e: + ssh.connect('localhost', port, timeout=5) + except Exception as e: + ssh.connect(getHostAddr(), port, timeout=30) + except Exception as e: + return False + + shell = ssh.invoke_shell(term='xterm', width=83, height=21) + shell.setblocking(0) + return shell + + def send(self): + pass + + def close(self): + try: + if self.__ssh: + self.__ssh.close() + except: + pass + + def wsSend(self, recv): + try: + t = recv.decode("utf-8") + return emit('server_response', {'data': t}) + except Exception as e: + return emit('server_response', {'data': recv}) + + def wsSendConnect(self): + return emit('connect', {'data': 'ok'}) + + def wsSendReConnect(self): + return emit('reconnect', {'data': 'ok'}) + + + def run(self, info): + if not self.__ssh: + self.__ssh = self.connectSsh() + + if self.__ssh.exit_status_ready(): + self.__ssh = self.connectSsh() + + self.__ssh.send(info) + try: + time.sleep(0.005) + recv = self.__ssh.recv(8192) + return self.wsSend(recv) + except Exception as ex: + return self.wsSend('') diff --git a/route/__init__.py b/route/__init__.py index 202bf4f2e..4a86b9d60 100755 --- a/route/__init__.py +++ b/route/__init__.py @@ -595,7 +595,6 @@ def index(reqClass=None, reqAction=None, reqData=None): ##################### ssh start ########################### -shell = None @socketio.on('webssh_websocketio') def webssh_websocketio(data): @@ -610,25 +609,13 @@ def webssh_websocketio(data): @socketio.on('webssh') -def webssh(msg): - global shell +def webssh(data): if not isLogined(): emit('server_response', {'data': '会话丢失,请重新登陆面板!\r\n'}) return None - if not shell: - shell = mw.connectSsh() - - if shell.exit_status_ready(): - shell = mw.connectSsh() - - if shell: - shell.send(msg) - try: - time.sleep(0.005) - recv = shell.recv(4096) - emit('server_response', {'data': recv.decode("utf-8")}) - except Exception as ex: - emit('server_response', {'data': str(ex)}) + import ssh_local + shell = ssh_local.ssh_local.instance() + shell.run(data) ##################### ssh end ###########################