Example #1
0
    def connect(self, ssh_info=None):
        if ssh_info: self._ssh_info = ssh_info
        if not self._host: self._host = self._ssh_info['host']
        # print('----------连接时的ssh_info--------------')
        if self._ssh_info['host'] in self._my_terms:
            if time.time() - self._my_terms[self._host].last_time < 86400:
                return True
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 262144)
            sock.connect((self._ssh_info['host'], int(self._ssh_info['port'])))
        except Exception as e:
            socketio.emit(self._room, "\rServer connection failed!\r")
            return False
        # 使用Transport连接
        p1 = paramiko.Transport(sock)
        p1.start_client()
        if not 'pkey' in self._ssh_info: self._ssh_info['pkey'] = None
        if not 'c_type' in self._ssh_info: self._ssh_info['c_type'] = None
        try:
            # 如果有pkey时则使用RSA私钥登录
            if self._ssh_info['pkey'] and self._ssh_info['c_type']:
                # print('------使用私钥登陆---------')
                # 将RSA私钥转换为io对象,然后生成rsa_key对象
                p_file = StringIO(self._ssh_info['pkey'])
                pkey = paramiko.RSAKey.from_private_key(p_file)
                p1.auth_publickey(username=self._ssh_info['username'].strip(),
                                  key=pkey)
            else:
                # print('-----------使用密码登陆-----------')
                p1.auth_password(username=self._ssh_info['username'].strip(),
                                 password=self._ssh_info['password'])
        except Exception as e:
            socketio.emit(self._room, "\rWrong user name or password!\r")
            p1.close()
            return False

        self._my_terms[self._host] = public.dict_obj()
        self._my_terms[self._host].last_time = time.time()
        self._my_terms[self._host].connect_time = time.time()
        # 打开会话
        self._my_terms[self._host].tty = p1.open_session()
        # 获取终端对象
        self._my_terms[self._host].tty.get_pty(term='xterm',
                                               width=100,
                                               height=34)
        self._my_terms[self._host].tty.invoke_shell()
        # 记录登陆记录
        #public.M('ssh_records').add('coll_user,ssh_user,host,cmd,addtime', (self._coll_user, self._ssh_info['username'], self._ssh_info['host'], 'login', int(time.time())))
        #print("登录成功")
        self._my_terms[self._host].last_send = []
        self._send_last = True
        return True
Example #2
0
    def send(self, c_data):
        try:
            if not c_data: return
            if not self._thread:
                s_file = '/www/server/panel/config/t_info.json'
                ssh_info = None
                if os.path.exists(s_file):
                    ssh_info = json.loads(
                        public.en_hexb(public.readFile(s_file)))

                if not 'host' in c_data:
                    host = "127.0.0.1"
                    if ssh_info:
                        c_data = ssh_info
                        host = c_data['host']
                else:
                    host = c_data['host']
                if not host:
                    if not ssh_info:
                        return socketio.emit(
                            self._room, "\rWrong user name or password!\r")
                    c_data = ssh_info
                key = 'ssh_' + host
                if 'password' in c_data:
                    session[key] = c_data
                if not key in session:
                    return socketio.emit(self._room,
                                         "\rWrong user name or password!\r")
                result = self.run(session[key])
            else:
                if len(c_data) > 10:
                    if c_data == 'new_bt_terminal':
                        if not self._send_last: self.last_send()
                        self._send_last = False
                        return
                    if c_data.find('resize_pty') != -1:
                        if self.resize(c_data): return
                if type(c_data) == dict: return
                if self._host in self._my_terms:
                    self._my_terms[self._host].last_time = time.time()
                    self._my_terms[self._host].tty.send(c_data)
                else:
                    return
        except:
            self.close()
            socketio.emit(self._room, '\rConnection failure!\r')
            print(public.get_error_info())
Example #3
0
 def recv(self):
     try:
         while True:
             data = self._my_terms[self._host].tty.recv(1024)
             if not data:
                 self.close()
                 socketio.emit(self._room,"\r连接已断开,按回车将尝试重新连接!\r")
                 return
             try:
                 result = data.decode()
             except:
                 result = str(data)
             if not result: continue
             self.set_last_send(result)
             socketio.emit(self._room,result)
     except:
         print(public.get_error_info())
Example #4
0
 def recv(self):
     try:
         while True:
             data = self._my_terms[self._host].tty.recv(1024)
             if not data:
                 self.close()
                 socketio.emit(
                     self._room,
                     "\rThe connection has been disconnected and pressing Enter will attempt to reconnect!\r"
                 )
                 return
             try:
                 result = data.decode()
             except:
                 result = str(data)
             if not result: continue
             self.set_last_send(result)
             socketio.emit(self._room, result)
     except:
         print(public.get_error_info())
Example #5
0
 def last_send(self):
     time.sleep(0.3)
     if 'last_send' in self._my_terms[self._host]:
         for d in self._my_terms[self._host].last_send:
             socketio.emit(self._room,d)
Example #6
0
 def not_send(self):
     if 'not_send' in self._my_terms[self._host]:
         if self._my_terms[self._host].not_send:
             socketio.emit(self._room,self._my_terms[self._host].not_send)
             self._my_terms[self._host].not_send = ""