जवाबों:
SSHClient पैरामिको में अधिक निचले स्तर की कार्यक्षमता के आसपास एक साधारण आवरण वर्ग है। API दस्तावेज़ एक सूचीबद्ध करता है recv_exit_status()
पर विधि Channel
वर्ग।
एक बहुत ही सरल प्रदर्शन स्क्रिप्ट:
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:
$
recv_exit_status
, तो आप इसे इस तरह से उपयोग नहीं कर सकते, क्योंकि कोड गतिरोध हो सकता है। आपको कमांड आउटपुट का उपभोग करना होगा, जबकि कमांड खत्म होने का इंतजार करना होगा। Paramiko ssh मरना / बड़े आउटपुट के साथ लटका हुआ देखना ।
एक बहुत आसान उदाहरण जिसमें "निचले स्तर" चैनल वर्ग को सीधे शामिल करना शामिल नहीं है (अर्थात - कमांड का उपयोग नहीं करना client.get_transport().open_session()
):
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
recv_exit_status
, तो आप इसे इस तरह से उपयोग नहीं कर सकते, क्योंकि कोड गतिरोध हो सकता है। आपको कमांड आउटपुट का उपभोग करना होगा, जबकि कमांड खत्म होने का इंतजार करना होगा। Paramiko ssh मरना / बड़े आउटपुट के साथ लटका हुआ देखना ।
JanC के लिए धन्यवाद, मैंने उदाहरण के लिए कुछ संशोधन जोड़े और पायथन 3 में परीक्षण किया, यह वास्तव में मेरे लिए उपयोगी है।
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()
मेरे मामले में, आउटपुट बफरिंग समस्या थी। बफरिंग के कारण, एप्लिकेशन से आउटपुट नॉन-ब्लॉकिंग तरीके से नहीं निकलता है। आप यहाँ बफ़रिंग के बिना आउटपुट प्रिंट करने के बारे में जवाब पा सकते हैं: आउटपुट बफ़रिंग अक्षम करें । संक्षेप में, बस इस तरह से -u विकल्प के साथ अजगर चलाएं:
> python -u script.py