2010-08-25 24 views

cevap

42

SSHClient, Paramiko'daki daha düşük düzeyli işlevsellik etrafında basit bir sarmalayıcı sınıfıdır. API documentation, Kanal sınıfında recv_exit_status() yöntemini listeler.

Çok basit gösteri komut:

$ cat sshtest.py 
import paramiko 
import getpass 

pw = getpass.getpass() 

client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.WarningPolicy()) 
client.connect('127.0.0.1', password=pw) 

while True: 
    cmd = raw_input("Command to run: ") 
    if cmd == "": 
     break 
    chan = client.get_transport().open_session() 
    print "running '%s'" % cmd 
    chan.exec_command(cmd) 
    print "exit status: %s" % chan.recv_exit_status() 

client.close() 

$ python sshtest.py 
Password: 
Command to run: true 
running 'true' 
exit status: 0 
Command to run: false 
running 'false' 
exit status: 1 
Command to run: 
$ 
+0

Cevabınız için teşekkür ederiz! Bunu projemde kullanıyorum. Çok teşekkür ederim. Şimdiye kadar python ile programlamada ssh sistem komutunu ssh yerine paramiko kullanabilirim. – Beyonder

+0

Sadece SSHClient kaynağına bakarak bir araya getirdiğim bir şey, bu yüzden * optimal * olmayabilir. BTW: eğer istediğini yaparsa, cevabımı "kabul etmek" isteyebilirsiniz. – JanC

+0

Bağlantı Öldü Lütfen bu sadece asılı ve asla geri dönerse güzel –

195

çok daha kolay bir örnek doğrudan kanal sınıfını çağırma içermez:

import paramiko 

client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
client.connect('blahblah.com') 

stdin, stdout, stderr = client.exec_command("uptime") 
print stdout.channel.recv_exit_status() # status is 0 

stdin, stdout, stderr = client.exec_command("oauwhduawhd") 
print stdout.channel.recv_exit_status() # status is 127 
+29

Bu, sorunun doğru çözümü. – gphilip

+1

Bu örnekle ilgili * güzel *, sadece EXIT'i (soru sorar gibi) değil, yine de STDOUT ve STDERR'yi alabileceğinizi göstermektir. Yıllar önce Paramiko'nun anemik örnek kod tabanı (saygısızlık yok) tarafından yanlış yönlendirildim ve EXIT'i almak için düşük seviyeli aktarım() çağrılarına başvurdum. taşıma() bir "birini seçmek" için zorluyordu (bu doğru olmayabilir, ancak örnek ve öğretici belgeler eksikliği bana inanmamı sağladı) ... –

5

Teşekkür Janc için ben örneğin bazı modifikasyon eklendi ve Python3'te test edildi, benim için gerçekten faydalı.

import paramiko 
import getpass 

pw = getpass.getpass() 

client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.WarningPolicy()) 
#client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

def start(): 
    try : 
     client.connect('127.0.0.1', port=22, username='ubuntu', password=pw) 
     return True 
    except Exception as e: 
     #client.close() 
     print(e) 
     return False 

while start(): 
    key = True 
    cmd = input("Command to run: ") 
    if cmd == "": 
     break 
    chan = client.get_transport().open_session() 
    print("running '%s'" % cmd) 
    chan.exec_command(cmd) 
    while key: 
     if chan.recv_ready(): 
      print("recv:\n%s" % chan.recv(4096).decode('ascii')) 
     if chan.recv_stderr_ready(): 
      print("error:\n%s" % chan.recv_stderr(4096).decode('ascii')) 
     if chan.exit_status_ready(): 
      print("exit status: %s" % chan.recv_exit_status()) 
      key = False 
      client.close() 
client.close() 
+0

herhangi bir hata iletisi alıyoruz - herhangi bir - chan.recv_stderr_ready() ?. Chan.recv_stderr (4096) .decode ('ascii') bir mesaj metni döndürüyor mu? – kten

İlgili konular