python连接远程服务器有很多实现方法,但是在我使用的时候却要要求做成服务的形式,连接信息用后端返回的形式。实现方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 import  paramikoimport  timefrom  apscheduler.schedulers.background import  BackgroundSchedulerclass  ssh_tunnel (object ):    def  survival_detection (self ):         interval_time = int (time.time()) - self.start_time         if  interval_time > 10800 :               self.close_connect()     def  __init__ (self, host_ip: str , port: int , user: str , pwd: str  ):         self.host_ip = host_ip         self.port = port         self.user = user         self.pwd = pwd         self.connect_obj = None          self.start_time = 9000000000            self.sched = BackgroundScheduler()         self.sched.add_job(self.survival_detection,                            trigger="interval" , hours=3 )         self.sched.start()     def  creat_connect (self ) -> dict :         '''建立连接'''          if  self.connect_obj != None :             return  {"status" : 1 , "info" : ">>>" }         try :             trans = paramiko.Transport((self.host_ip, self.port))             trans.start_client()             trans.auth_password(self.user, self.pwd)             channel = trans.open_session(timeout=1200 )               channel.get_pty()               channel.invoke_shell()               while  channel.recv_ready() == True :                 time.sleep(0.01 )                 break              time.sleep(1 )             result = channel.recv(10240 )             create_str = result.decode("utf-8" )             self.connect_obj = channel             self.start_time = int (time.time())             return  {"status" : 1 , "info" : create_str}         except :             return  {"status" : -1 , "info" : "Remote connection failed!" }     def  execute_cmd (self, commd_str: str  = ""  ) -> dict :         '''执行命令'''          if  self.connect_obj == None :             return  {"status" : -1 , "info" : "Remote connection failed!" }         try :             self.connect_obj.send(commd_str + "\n" )               while  self.connect_obj.recv_ready() == True :                   time.sleep(0.01 )                 break              time.sleep(0.5 )             result = self.connect_obj.recv(10240 )               result = result.decode("utf-8" )             _result = result[::-1 ]              _str  = result[len (result)-_result.index('\r' )-1 ::]             result = result.replace(_str *2 , _str )             self.start_time = int (time.time())               return  {"status" : 1 , "info" : result.replace(commd_str.strip()+'\r\n' , '' )}         except :             return  {"status" : -1 , "info" : "Remote connection failed!" }     def  close_connect (self ) -> dict :         if  self.connect_obj == None :             return  {"status" : -1 , "info" : "Remote connection failed!" }         try :             self.connect_obj.close()             return  {"status" : 1 , "info" : 'Connection closed!' }         except :             return  {"status" : -1 , "info" : "Connection closing failed!" } if  __name__ == "__main__" :    test = ssh_tunnel(host_ip='*.*.*.*' ,                       port=22 , user='root' , pwd='admin' )     res = test.creat_connect()     print (res.get('info' , '' ), end='' )     commd_str = input ("" )     while  commd_str != '-1' :         res = test.execute_cmd(commd_str + "\n" )         print (res.get('info' , '' ), end='' )         commd_str = input ("" )     test.close_connect()