2016-04-08 15 views
5

Paramiko kullanarak uzak ana bilgisayarda birkaç komut çalıştırmayı planlıyorum, ancak bir komut çalıştırdıktan sonra ssh oturumu kapatıldı.
kod aşağıda listelenen:ssh oturumu nasıl paramiko kullanarak süresi dolmaz?

from paramiko import SSHClient 
import paramiko 
ssh = SSHClient() 
ssh.load_system_host_keys() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect(host, 22, user, passwd, timeout=3) 
stdin, stdout, stderr = ssh.exec_command('uname -a') 

Yani kapanmasını SSH oturumu durdurmak için herhangi bir yolu var mı? Ya da paramiko için herhangi bir alternatif var mı?

Güncelleme:
bir Linux sunucuya bağlıyken benim Macbook exec_command çağıran tutmak başardı, ancak ssh oturumu anahtara bağlandığında bir Linux sunucusunda bir kez exec_command sonra otomatik olarak kapatılır ve bir yükseltilmiş
SSHException: paramiko.ssh_exception.SSHException: SSH session not active

>>> print ssh.get_transport() 
>>> <paramiko.Transport at 0xf00216d0L (unconnected)> 
>>> print ssh.get_transport().is_active() 
>>> False 
>>> print ssh.get_transport().is_authenticated() 
>>> False 

aktif her zaman paramiko sSH oturumu tutmak için herhangi bir yolu var mı?

(istemci modu) iplik başlangıç: 0x2657e10L
Bağlandı (versiyon 1.99, istemci Comware-5,20)
KEX algos: [u'diffie-Hellman

paramiko ayıklama modu bilgileri

şöyle döndü -group-exchange-sha1 ', u'diffie-hellman- grubu14-sha1', u'diffie-hellman-group1-sha1 '] sunucu anahtarı: [u'ssh-rsa'] istemci şifrelemek: [u'aes128-cbc ', u'3des-cbc', u'des-cbc '] sunucu şifrelemek: [u'aes128-cbc', u'3des-cbc ', u'des-cbc'] istemci mac: [u'hmac-sha1 'u'hmac-sha1-96', u'hmac-md5 ', u'hmac-md5-96'] sunucu mac: [u'hmac-sha1 ', u'hmac-sha1-96', u'hmac -md5 ', u'hmac-md5-96'] istemci sıkıştırması: [u'none '] sunucu sıkıştırması: [ u'none '] lang: [u' '] sunucu lang: [u' '] kex izler? Yanlış
Kabul edilen şifreler: local = aes128-cbc, uzak = aes128-cbc
kex diffie-hellman-group14 kullanarak -sha1; sunucu anahtar tipi ssh-rsa; şifre: yerel aes128-cbc, uzak aes128-cbc; mac: yerel hmac-sha1, uzak hmac-sha1; sıkıştırma: yerel yok, uzaktan kumanda yok
Yeni anahtarlara geç ...
userauth is OK
Kimlik doğrulama (parola) başarılı!
[Chan 0] Maksimum paket içinde: 32768 bayt
içinde [Chan 1] Maksimum paket: üzerinden paket 32768 bayt
[Chan 0] En: açılan 32496 bayt
Secsh kanal 0.
Secsh kanalı 2 açma hatası:
Kaynak sıkıntısı: Kaynak sıkıntısı
[chan 0] Sesch kanalı 0 isteği Tamam
[chan 0] EOF gönderilen (0)

+0

Komut dosyasına bundan daha fazlası var mı? Exec_command' işlevini çağırabiliyor olmalısınız. – tdelaney

+0

Merhaba? Komutta birkaç komut mu koşuyorsunuz yoksa her birinde bir komutla birkaç komut dosyası çalıştırıyor musunuz? – tdelaney

+0

MacBook'umda exec_command'ı çağırmayı başarabiliyordum, ancak bir Linux sunucusunda çalışmadı ve bir SSHException geliştirdi: paramiko.ssh_exception.SSHException: SSH oturumu etkin değil. Mac'te Python sürümü 2.7.11 ama Linux sunucusu 2.6.6. @tdelaney –

cevap

1

Sana timeout kullandıklarını görmek senin bağlantı çağrısında parametre:

ssh.connect(host, 22, user, passwd, timeout=3) 

belgelerden;

zaman aşımı (şamandıra) - script'lerime birinde

bağlamak TCP için (saniye cinsinden) isteğe bağlı bir zaman aşımı ben sadece yapın: bağlantıyı açık tutar

ssh = paramiko.SSHClient() 
ssh.connect(host, username=settings.user) 

ben

arayana kadar
ssh.close() 
+0

Aynı sonuç, Linux sunucusundan bir ** anahtarına ** bağlandığında, ancak bir Linux'a başka bir bilgisayardan bağlandığında iyi çalıştı. 'Timeout' parametresini ekleyip eklememek farklı değil. @LarsVegas –

+0

bunu gördünüz [SO] (http://stackoverflow.com/questions/31477121/python-paramiko-ssh-exception-ssh-session-not-active)? – LarsVegas

+0

Etkin olmayan ssh oturumu sorununu kesinlikle çözdüm, ancak paralel olarak çalıştırdığımda, ilk komutu gönderdikten sonra kanal orada asılı tutuluyordu. @LarsVegas –

1

Paramiko kullanarak, uzak kabuk üzerinde bir komut yürütüldükten sonra kanalın kapatılmadığı şekilde interaktif bir kabuk uygulayabilirsiniz.

import paramiko 
import re 


class ShellHandler: 

    def __init__(self, host, user, psw): 
     self.ssh = paramiko.SSHClient() 
     self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
     self.ssh.connect(host, username=user, password=psw, port=22) 

     channel = self.ssh.invoke_shell() 
     self.stdin = channel.makefile('wb') 
     self.stdout = channel.makefile('r') 

    def __del__(self): 
     self.ssh.close() 

    @staticmethod 
    def _print_exec_out(cmd, out_buf, err_buf, exit_status): 
     print('command executed: {}'.format(cmd)) 
     print('STDOUT:') 
     for line in out_buf: 
      print(line, end="") 
     print('end of STDOUT') 
     print('STDERR:') 
     for line in err_buf: 
      print(line, end="") 
     print('end of STDERR') 
     print('finished with exit status: {}'.format(exit_status)) 
     print('------------------------------------') 
     pass 

    def execute(self, cmd): 
     """ 

     :param cmd: the command to be executed on the remote computer 
     :examples: execute('ls') 
        execute('finger') 
        execute('cd folder_name') 
     """ 
     cmd = cmd.strip('\n') 
     self.stdin.write(cmd + '\n') 
     finish = 'end of stdOUT buffer. finished with exit status' 
     echo_cmd = 'echo {} $?'.format(finish) 
     self.stdin.write(echo_cmd + '\n') 
     shin = self.stdin 
     self.stdin.flush() 

     shout = [] 
     sherr = [] 
     exit_status = 0 
     for line in self.stdout: 
      if str(line).startswith(cmd) or str(line).startswith(echo_cmd): 
       # up for now filled with shell junk from stdin 
       shout = [] 
      elif str(line).startswith(finish): 
       # our finish command ends with the exit status 
       exit_status = int(str(line).rsplit(maxsplit=1)[1]) 
       if exit_status: 
        # stderr is combined with stdout. 
        # thus, swap sherr with shout in a case of failure. 
        sherr = shout 
        shout = [] 
       break 
      else: 
       # get rid of 'coloring and formatting' special characters 
       shout.append(re.compile(r'(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]').sub('', line). 
          replace('\b', '').replace('\r', '')) 

     # first and last lines of shout/sherr contain a prompt 
     if shout and echo_cmd in shout[-1]: 
      shout.pop() 
     if shout and cmd in shout[0]: 
      shout.pop(0) 
     if sherr and echo_cmd in sherr[-1]: 
      sherr.pop() 
     if sherr and cmd in sherr[0]: 
      sherr.pop(0) 

     self._print_exec_out(cmd=cmd, out_buf=shout, err_buf=sherr, exit_status=exit_status) 
     return shin, shout, sherr 
İlgili konular