इसके लिए paramiko का उपयोग करना संभव नहीं है।


यह एक लिनक्स ओएस पर चलाए जा रहे एक पायथन प्रोग्राम के लिए है। निम्नलिखित विधि का उपयोग करके मैं अपने शेल्फ पर किसी अन्य कार्ड में सफलतापूर्वक ssh कर सकता हूं।

def ssh(self, target_arg):
        cmd = self.get_command_output(subprocess.Popen(["ssh", target_arg], stdout=subprocess.PIPE))
        return cmd.communicate()[0]

हालाँकि मेरे पास सुरक्षित शेल पर निष्पादित करने के लिए आदेशों की एक सरणी है:

commands = ["cd somepath/file/examplefilepath","./examplebashscript"]

जिसे मैं अपने अजगर कार्यक्रम से ssh'd कार्ड पर कालानुक्रमिक रूप से निष्पादित करना चाहता हूं:

def ssh_with_commands(self, target_arg, commands):
        self.ssh(target_arg)
        for command in commands:
            # execute command on target shelf shell

और फिर बाकी पायथन प्रोग्राम को मूल थ्रेड पर चलाना जारी रखें।


मैं इन आदेशों को ssh में कैसे पाइप करता हूं या समाधान क्या हो सकता है, इस पर कोई समाधान?

ईमानदारी से एक अजगर और लिनक्स newb।

1
Nathan Ormond 18 अक्टूबर 2018, 17:28

2 जवाब

सबसे बढ़िया उत्तर

आदेशों को ssh को ही पास करना होगा; self.ssh(...) तब तक वापस नहीं आता जब तक आप रिमोट शेल से बाहर नहीं निकल जाते। इसके लिए ssh को संशोधित करने की आवश्यकता होगी।

def ssh(self, target_arg, commands=None):
        cmd_args = ["ssh", target_arg]
        if commands is not None:
            cmd_args.append(";".join(commands))
        output = self.get_command_output(subprocess.Popen(cmd_args, stdout=subprocess.PIPE))
        return cmd.communicate()[0]

ध्यान दें कि उद्धरण के संबंध में इसमें कुछ महत्वपूर्ण कमियां हैं; आप शायद एक कनेक्शन खोलने और एक समय में एक कमांड भेजने के लिए Paramiko जैसी लाइब्रेरी का उपयोग करना बेहतर समझते हैं।

1
chepner 18 अक्टूबर 2018, 14:40

SSH पहले से ही शेल के बजाय कमांड चलाने की अनुमति देता है।

NAME ssh -- OpenSSH SSH क्लाइंट (दूरस्थ लॉगिन प्रोग्राम)

SYNOPSIS ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i पहचान_फाइल] [-जे गंतव्य] [-एल पता] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o विकल्प] [-p पोर्ट] [-Q query_option] [-R पता] [-S ctl_path] [-W होस्ट: पोर्ट] [-w local_tun[:remote_tun]] गंतव्य [कमांड]

इस प्रकार, एक सरल समाधान खुद को प्रस्तुत करता है: उन आदेशों को रखें जिन्हें आप अपने सर्वर पर एक स्क्रिप्ट फ़ाइल के अंदर चलाना चाहते हैं। और फिर बस अपना ssh कमांड इस तरह चलाएँ:

ssh <server> ./script.sh

यह उदाहरण मानता है कि आपकी स्क्रिप्ट फ़ाइल उस उपयोगकर्ता की होम निर्देशिका में स्थित है जिसे आप लॉग इन कर रहे हैं। अन्यथा, बस फ़ाइल का पूरा पथ निर्दिष्ट करें।

1
xrisk 18 अक्टूबर 2018, 14:53