2010-08-25 12 views
64
client = paramiko.SSHClient() 
stdin, stdout, stderr = client.exec_command(command) 

क्या कमांड वापसी कोड प्राप्त करने का कोई तरीका है?पैरामीको का उपयोग करके आप एसएसएच रिटर्न कोड कैसे प्राप्त कर सकते हैं?

सभी stdout/stderr को पार्स करना मुश्किल है और पता है कि आदेश सफलतापूर्वक समाप्त हुआ है या नहीं।

उत्तर

42

एसएसएच क्लाइंट पैरामीको में निचले स्तर की कार्यक्षमता के आसपास एक साधारण रैपर वर्ग है। API documentation चैनल वर्ग पर recv_exit_status() विधि सूचीबद्ध करता है।

एक बहुत ही सरल प्रदर्शन स्क्रिप्ट:

$ 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

वास्तव में आपके उत्तर के लिए सराहना करते हैं !! मैंने इसे अपने प्रोजेक्ट में उपयोग किया है। बहुत बहुत धन्यवाद। अब तक मैं पायथन के साथ प्रोग्रामिंग में सिस्टम कमांड एसएसएच लपेटने के बजाय paramiko का उपयोग कर सकते हैं। – Beyonder

+0

यह केवल कुछ है जो मैंने एसएसएच क्लाइंट के स्रोत को देख कर एक साथ रखा है, इसलिए यह * इष्टतम * नहीं हो सकता है। बीटीडब्ल्यू: यदि यह वही करता है जो आप चाहते हैं, तो आप मेरे जवाब को "स्वीकार" करना चाहेंगे। – JanC

+0

लिंक मृत कृपया –

195

बहुत आसान उदाहरण है कि सीधे चैनल वर्ग लागू शामिल नहीं करता है: JanC के लिए

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

यह प्रश्न का सही समाधान है। – gphilip

+1

इस उदाहरण के बारे में * अच्छा * क्या है केवल कैप्चर नहीं कर रहा है (जैसे प्रश्न पूछता है), लेकिन यह दर्शाता है कि आप अभी भी STDOUT और STDERR प्राप्त कर सकते हैं। साल पहले मुझे परमिको के एनीमिक उदाहरण कोडबेस (कोई अपमान नहीं) द्वारा गुमराह किया गया था, और EXIT प्राप्त करने के लिए मैंने निम्न स्तरीय परिवहन() कॉल का सहारा लिया। परिवहन() आपको "एक चुनने" के लिए मजबूर करना प्रतीत होता है (जो सच नहीं हो सकता है, लेकिन उदाहरणों और ट्यूटोरियल दस्तावेज़ों की कमी ने मुझे विश्वास दिलाया है) ... –

5

धन्यवाद, मैं उदाहरण के लिए कुछ संशोधन जोड़ा गया है और Python3 में परीक्षण किया, यह वास्तव में मेरे लिए उपयोगी है।

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

क्या हमें कोई त्रुटि संदेश मिलता है - अगर कोई भी - chan.recv_stderr_ready में() ?. क्या chan.recv_stderr (4096) .decode ('ascii') यह एक संदेश पाठ देता है? – kten