কীভাবে আপনি প্যারামিকো ব্যবহার করে এসএসএইচ রিটার্ন কোড পাবেন?


97
client = paramiko.SSHClient()
stdin, stdout, stderr = client.exec_command(command)

কমান্ড রিটার্ন কোড পাওয়ার কোনও উপায় আছে কি?

সমস্ত স্টডআউট / স্টডারকে পার্স করা এবং কমান্ডটি সফলভাবে শেষ হয়েছে কিনা তা জেনে রাখা শক্ত hard

উত্তর:


52

এসএসএইচসি্লিয়েন্টটি প্যারামিকোতে আরও নিম্ন-স্তরের কার্যকারিতার চারপাশে একটি সাধারণ মোড়কের ক্লাস। এপিআই ডকুমেন্টেশন একটি তালিকা 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: 
$

9
এটি একটি খারাপ সমাধান। নীচে @apdastous 'উত্তর দেখুন, এটি আরও ভাল।
প্যাট্রিক

আপনি যখন সঠিক হন recv_exit_status, আপনি কোডটি এইভাবে ব্যবহার করতে পারবেন না, কারণ কোডটি অচল হয়ে যেতে পারে। কমান্ডটি শেষ হওয়ার অপেক্ষায় আপনাকে কমান্ড আউটপুট গ্রহন করতে হবে। বড় আউটপুট সহ প্যারামিকো এসএস ডাই / হ্যাং দেখুন ।
মার্টিন প্রিক্রিল

292

একটি আরও সহজ উদাহরণ যা সরাসরি "নিম্ন স্তরের" চ্যানেল শ্রেণীর সাথে জড়িত না (যেমন - কমান্ডটি ব্যবহার না করে 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

4
কী চমৎকার এই উদাহরণে সম্পর্কে না শুধু প্রস্থান করুন ক্যাপচার করা হয় (প্রশ্ন মত জিজ্ঞেস), কিন্তু আপনি এখনও stdout- এ এবং stderr পেতে পারেন প্রদর্শক। কয়েক বছর আগে আমি প্যারামিকোর রক্তাল্পতার উদাহরণ কোডবেস দ্বারা (কোনও সম্মানহীন নয়) বিভ্রান্ত হয়েছিলাম এবং এক্সিট পেতে আমি নিম্ন-স্তরের পরিবহন () কলগুলি অবলম্বন করেছি। পরিবহন () আপনাকে "একটি বাছাই" করতে বাধ্য করেছিল (যা সত্য হতে পারে না, তবে উদাহরণ এবং টিউটোরিয়াল ডক্সের অভাব আমাকে বিশ্বাস করতে পরিচালিত করেছে) ...
স্কট প্রাইভ

আপনি যখন সঠিক হন recv_exit_status, আপনি কোডটি এইভাবে ব্যবহার করতে পারবেন না, কারণ কোডটি অচল হয়ে যেতে পারে। কমান্ডটি শেষ হওয়ার অপেক্ষায় আপনাকে কমান্ড আউটপুট গ্রহন করতে হবে। বড় আউটপুট সহ প্যারামিকো এসএস ডাই / হ্যাং দেখুন ।
মার্টিন প্রিক্রিল

5

জানকের জন্য ধন্যবাদ, উদাহরণের জন্য আমি কিছু সংশোধন করেছি এবং পাইথন 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()

চান.recv_stderr_ چمتو ()? - এ কি আমরা কোনও ত্রুটি বার্তা পাই? চান.recv_stderr (4096) .ডেকোড ('ascii') এটি কি বার্তার পাঠ্য ফেরত দেয়?
Kten 11

0

আমার ক্ষেত্রে, আউটপুট বাফারিংয়ের সমস্যা ছিল। বাফারিংয়ের কারণে, অ্যাপ্লিকেশনটির আউটপুটগুলি অ-ব্লকিংয়ের পথে আসে না। আপনি এখানে বাফারিং ছাড়াই কীভাবে আউটপুট প্রিন্ট করবেন সে সম্পর্কে উত্তর পেতে পারেন: আউটপুট বাফারিং অক্ষম করুন । সংক্ষেপে, কেবল এইভাবে -u বিকল্পের সাথে পাইথন চালান:

> python -u script.py

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.