2013-06-26 4 views
3

Учитывая следующий код:соединения класса и SSH Python не работает

class sshConnection(): 
     def getConnection(self,IP,USN,PSW): 
     try: 
      client = paramiko.SSHClient() 
      client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
      client.connect(IP,username=USN, password=PSW) 
      channel = client.invoke_shell() 
      t = channel.makefile('wb') 
      stdout = channel.makefile('rb') 
      print t //The important lines 
      return t //The important lines 
     except: 
      return -1 

    myConnection=sshConnection().getConnection("xx.xx.xx.xx","su","123456") 
    print myConnection 

результат:

<paramiko.ChannelFile from <paramiko.Channel 1 (open) window=1000 ->  <paramiko.Transport at 0xfcc990L (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>> 

<paramiko.ChannelFile from <paramiko.Channel 1 (closed) -> <paramiko.Transport at 0xfcc930L (unconnected)>>> 

Что означает: Внутри метода класса, то t соединение связано, но после возвращения этот дескриптор соединения, соединение потеряно.

Почему это и как я могу заставить его работать?

Спасибо!

ответ

0

Вы должны вернуть и хранить где-то переменные client и channel. Они должны оставаться в живых до тех пор, пока живет t, но, по-видимому, парамико не подчиняется конвенции Питона.

+0

Спасибо, это то, чего я не знал. – user2162550

1

Ваш клиент выходит из области действия при возврате метода и автоматически закрывает файл канала. Попробуйте сохранить клиента как участника и сохраните sshConnection, пока не закончите с клиентом, что-то вроде этого;

import paramiko 

class sshConnection(): 
    def getConnection(self,IP,USN,PSW): 
     try: 
      self.client = paramiko.SSHClient() 
      self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
      self.client.connect(IP,username=USN, password=PSW) 
      channel = self.client.invoke_shell() 
      self.stdin = channel.makefile('wb') 
      self.stdout = channel.makefile('rb') 
      print self.stdin # The important lines 
      return 0 # The important lines 
     except: 
      return -1 

conn = sshConnection() 
print conn.getConnection("ubuntu-vm","ic","out69ets") 
print conn.stdin 


$ python test.py 
<paramiko.ChannelFile from <paramiko.Channel 1 (open) window=2097152 -> <paramiko.Transport at 0xb3abcd0L (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>> 
<paramiko.ChannelFile from <paramiko.Channel 1 (open) window=2097152 -> <paramiko.Transport at 0xb3abcd0L (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>> 

Конечно, убрать вещи немного, вы можете скрыть STDIN/STDOUT и использовать их с помощью других методов на sshConnection вместо этого, таким образом, вы будете иметь только следить, что вместо нескольких файлы и соединение.

+0

Спасибо! оно работает. – user2162550