mdserver-web/web/utils/ssh/ssh_local.py

132 lines
3.6 KiB
Python
Raw Normal View History

2024-11-11 10:48:44 -05:00
# coding: utf-8
# ---------------------------------------------------------------------------------
# MW-Linux面板
# ---------------------------------------------------------------------------------
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
# ---------------------------------------------------------------------------------
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
# ---------------------------------------------------------------------------------
# SSH终端操作
# ---------------------------------------------------------------------------------
import json
import time
import os
import sys
import socket
import threading
import re
from io import BytesIO, StringIO
import core.mw as 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
2025-05-23 12:51:29 -04:00
__lock = False
2024-11-11 10:48:44 -05:00
# lock
_instance_lock = threading.Lock()
def __init__(self):
2024-11-11 12:12:15 -05:00
self.__debug_file = mw.getPanelDir()+ '/logs/ssh_terminal.log'
2024-11-11 10:48:44 -05:00
@classmethod
def instance(cls, *args, **kwargs):
if not hasattr(ssh_local, "_instance"):
with ssh_local._instance_lock:
if not hasattr(ssh_local, "_instance"):
ssh_local._instance = ssh_local(*args, **kwargs)
return ssh_local._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):
2025-05-23 12:51:29 -04:00
if self.__lock :
return False
self.__lock = True
2024-11-11 10:48:44 -05:00
import paramiko
ssh = paramiko.SSHClient()
mw.createSshInfo()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
port = mw.getSSHPort()
try:
2025-05-23 12:44:49 -04:00
ssh.connect('127.0.0.1', 22, timeout=5)
except Exception as e:
2024-11-11 10:48:44 -05:00
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(mw.getHostAddr(), port, timeout=30)
except Exception as e:
return False
shell = ssh.invoke_shell(term='xterm', width=83, height=21)
shell.setblocking(0)
2025-05-23 12:51:29 -04:00
2025-05-23 12:51:38 -04:00
self.__lock = False
2024-11-11 10:48:44 -05:00
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()
2025-05-23 13:03:08 -04:00
if self.__ssh:
2025-05-23 13:03:31 -04:00
if self.__ssh.exit_status_ready():
self.__ssh = self.connectSsh()
2025-05-23 13:03:08 -04:00
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('')
else:
2025-05-23 13:05:41 -04:00
return self.wsSend("连接中...\r\n")