सवाल पायथन का उपयोग कर एसएसएच का सबसे आसान तरीका क्या है?


मैं स्थानीय पायथन (3.0) स्क्रिप्ट से दूरस्थ सर्वर पर बस एसएसएच कैसे कर सकता हूं, लॉगिन / पासवर्ड की आपूर्ति कर सकता हूं, कमांड निष्पादित कर सकता हूं और आउटपुट को पायथन कंसोल पर प्रिंट कर सकता हूं?

मैं किसी भी बाहरी बाहरी पुस्तकालय का उपयोग नहीं करता या दूरस्थ सर्वर पर कुछ भी स्थापित नहीं करता।


76
2017-08-05 14:34


मूल




जवाब:


मैंने कोशिश नहीं की है, लेकिन यह pysftp मॉड्यूल मदद कर सकता है, जो बदले में paramiko का उपयोग करता है। मेरा मानना ​​है कि सब कुछ क्लाइंट-साइड है।

दिलचस्प आदेश शायद है .execute() जो रिमोट मशीन पर एक मनमाने ढंग से कमांड निष्पादित करता है। (मॉड्यूल भी विशेषताएं .get() तथा .put विधियां जो इसके एफ़टीपी चरित्र को अधिक पसंद करती हैं)।

अद्यतन करें:

मैंने मूल रूप से लिंक किए गए ब्लॉग पोस्ट के बाद उत्तर को फिर से लिखा है, अब उपलब्ध नहीं है। इस टिप्पणी के पुराने संस्करण को संदर्भित करने वाली कुछ टिप्पणियां अब अजीब लगती हैं।


38
2017-08-05 14:49



अच्छा खोज! जब तक आप त्रुटि प्रतिक्रियाओं को अनुकूलित करने की परवाह नहीं करते हैं, तब तक यह अतिरिक्त अमूर्तता बहुत उपयोगी होगी। - Cascabel
एसएसएच मॉड्यूल ने चाल की। सरल और ठीक काम करता है। पैरामीको एपीआई के माध्यम से कोई खोज नहीं। - Christopher Tokar
आपके द्वारा दिए गए लिंक के अंदर ssh.py फ़ाइल का लिंक टूटा हुआ है: / - dgorissen
हाँ, क्या हमारे पास एक नया लिंक हो सकता है। मैंने github पर ssh.py पाया, लेकिन यह वही नहीं है (और उतना अच्छा नहीं है) - jdborg
Pysftp पैकेज केवल एसएफटीपी प्रदान करता है। एक एसएसएच ग्राहक से बहुत दूर। - bortzmeyer


ऊपर दिए गए अनुसार, आप पैरामीको का उपयोग कर इसे स्वयं कोड कर सकते हैं। वैकल्पिक रूप से, आप फैब्रिक, पाइथन एप्लिकेशन को उन सभी चीजों को करने के लिए देख सकते हैं जिनके बारे में आपने पूछा था:

कपड़ा एक पायथन पुस्तकालय है और   कमांड लाइन उपकरण के लिए डिज़ाइन किया गया   तैनाती अनुप्रयोगों को व्यवस्थित करें या   सिस्टम प्रशासन कार्यों का प्रदर्शन   एसएसएच प्रोटोकॉल के माध्यम से। यह प्रावधान   मनमाने ढंग से खोल चलाने के लिए उपकरण   आदेश (या तो सामान्य लॉगिन के रूप में   उपयोगकर्ता, या सूडो के माध्यम से), अपलोड और   फाइलें डाउनलोड करना, और बहुत आगे।

मुझे लगता है कि यह आपकी जरूरतों के अनुरूप है। यह एक बड़ी लाइब्रेरी भी नहीं है और इसके लिए कोई सर्वर इंस्टॉलेशन की आवश्यकता नहीं है, हालांकि इसमें परमिको और पिक्रिप्ट पर निर्भरता है जिसके लिए क्लाइंट पर इंस्टॉलेशन की आवश्यकता होती है।

ऐप होता था यहाँ। अब यह पाया जा सकता है यहाँ

* The official, canonical repository is git.fabfile.org
* The official Github mirror is GitHub/bitprophet/fabric

इस पर कई अच्छे लेख हैं, हालांकि आपको सावधान रहना चाहिए क्योंकि पिछले छह महीनों में यह बदल गया है:

फैब्रिक के साथ Django तैनात करना

आधुनिक पायथन हैकर के उपकरण: वर्चुअलनेव, फैब्रिक और पिप

फैब्रिक और वर्चुअलनेव के साथ सरल और आसान परिनियोजन


बाद में: फैब्रिक को अब स्थापित करने के लिए paramiko की आवश्यकता नहीं है:

$ pip install fabric
Downloading/unpacking fabric
  Downloading Fabric-1.4.2.tar.gz (182Kb): 182Kb downloaded
  Running setup.py egg_info for package fabric
    warning: no previously-included files matching '*' found under directory 'docs/_build'
    warning: no files found matching 'fabfile.py'
Downloading/unpacking ssh>=1.7.14 (from fabric)
  Downloading ssh-1.7.14.tar.gz (794Kb): 794Kb downloaded
  Running setup.py egg_info for package ssh
Downloading/unpacking pycrypto>=2.1,!=2.4 (from ssh>=1.7.14->fabric)
  Downloading pycrypto-2.6.tar.gz (443Kb): 443Kb downloaded
  Running setup.py egg_info for package pycrypto
Installing collected packages: fabric, ssh, pycrypto
  Running setup.py install for fabric
    warning: no previously-included files matching '*' found under directory 'docs/_build'
    warning: no files found matching 'fabfile.py'
    Installing fab script to /home/hbrown/.virtualenvs/fabric-test/bin
  Running setup.py install for ssh
  Running setup.py install for pycrypto
...
Successfully installed fabric ssh pycrypto
Cleaning up...

यह ज्यादातर कॉस्मेटिक है, हालांकि: एसएसएच paramiko का एक कांटा है, दोनों पुस्तकालयों के लिए रखरखाव वही है (जेफ फोर्सियर, फैब्रिक के लेखक भी), और रखरखाव ने परमीको नाम के तहत परमिको और एसएसएच को एकजुट करने की योजना बनाई है। (के माध्यम से यह सुधार pbanka।)


60
2017-08-05 15:00



जैसा कि यह एक दिलचस्प लिंक लगता है, मैं इसे अपडेट करना चाहता हूं क्योंकि आपका अब टूटा हुआ है। इस्तेमाल करें: clemesha.org/blog/... - dlewin
धन्यवाद। 404 लिंक फिक्स्ड। - hughdbrown
क्या पूछताछकर्ता ने निर्दिष्ट नहीं किया कि वह "बड़ी बाहरी पुस्तकालय" का उपयोग नहीं करना चाहता? पैरामीको और फैब्रिक दोनों ओवरकिल हैं जब सभी लेखक वास्तव में पूछते हैं कि एक साधारण एक-ऑफ एसएसएच रेसिपी है। - Zoran Pavlovic
@ ज़ोरान पावलोविक: सभी उत्तरों या तो स्थानीय पैकेज (paramiko, fabric, ssh, libssh2) स्थापित करने के लिए या ssh चलाने के लिए उपप्रोसेसर का उपयोग करने के लिए थे। उत्तरार्द्ध एक नो-इंस्टॉलेशन समाधान है, लेकिन मुझे नहीं लगता कि स्पॉन्गिंग एसएसएच एक अच्छा विचार है, और न ही ओपी ने एसएस मॉड्यूल स्थापित करने के जवाब का चयन किया था। वे दस्तावेज़ कहते हैं: "ssh.py तीन सामान्य एसएसएच संचालन, प्राप्त, रख और निष्पादित करता है। यह परमिको पर एक उच्च स्तरीय अमूर्त है।" तो जब तक आप libssh2 का पक्ष नहीं लेते, जो कोडिंग पर भारी है, वहां कोई अनुरूप सिफारिश नहीं है। मैं एक अच्छा समाधान देने का पक्ष लेता हूं जब ओपी की स्थितियों को उचित रूप से पूरा नहीं किया जा सकता है। - hughdbrown


यदि आप किसी भी अतिरिक्त मॉड्यूल से बचना चाहते हैं, तो आप चलाने के लिए उपप्रोसेसर मॉड्यूल का उपयोग कर सकते हैं

ssh [host] [command]

और आउटपुट कैप्चर करें।

कुछ ऐसा करने का प्रयास करें:

process = subprocess.Popen("ssh example.com ls", shell=True,
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output,stderr = process.communicate()
status = process.poll()
print output

उपयोगकर्ता नाम और पासवर्ड से निपटने के लिए, आप एसएसएच प्रक्रिया के साथ बातचीत करने के लिए उपप्रोसेस का उपयोग कर सकते हैं, या आप पासवर्ड प्रॉम्प्ट से बचने के लिए सर्वर पर एक सार्वजनिक कुंजी स्थापित कर सकते हैं।


22
2017-08-05 15:05



लेकिन अगर ग्राहक विंडोज पर है तो क्या होगा? - Nathan
पासवर्ड को आपूर्ति करना मुश्किल हो सकता है ssh एक पाइप के माध्यम से subprocess। देख क्यों न सिर्फ एक पाइप (popen ()) का उपयोग करें?। आपको जरूरत हो सकती है pty, pexpect इसे काम करने के लिए मॉड्यूल। - jfs
स्ट्रिंग के एसएससी कंप्यूटर के लिए काम नहीं करता है; पायथन-सी "आयात numpy; प्रिंट numpy .__ संस्करण__" यह कहता है कि यह "आयात" आदेश नहीं जानता है - usethedeathstar
@usethedeathstar: उद्धरण में पूरे रिमोट कमांड को लपेटें: ssh somecomputer 'python -c "इसे आयात करें; इसे प्रिंट करें" - Neil


मैनें लिखा है Libssh2 के लिए पायथन बाइंडिंग्स। Libssh2 एसएसएच 2 प्रोटोकॉल को लागू करने वाली क्लाइंट-साइड लाइब्रेरी है।

import socket
import libssh2

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('exmaple.com', 22))

session = libssh2.Session()
session.startup(sock)
session.userauth_password('john', '******')

channel = session.channel()
channel.execute('ls -l')

print channel.read(1024)

16
2018-02-28 12:51



यह बहुत कम स्तर लगता है। उदाहरण के लिए (आपका स्वयं का उदाहरण), आपको स्पष्ट रूप से कहना होगा कि आप आईपीवी 4 या आईपीवी 6 (कुछ ऐसा जो आपको ओपनएसएसएच कमांड लाइन क्लाइंट के साथ नहीं करना है) का उपयोग करना है। साथ ही, मुझे यह नहीं मिला कि इसे एसएसएच एजेंट के साथ कैसे काम करना है। - bortzmeyer
Pylibssh2 के बारे में अच्छी बात यह है कि यह एसएसएच के किसी भी देशी पायथन कार्यान्वयन से paramiko की तरह फ़ाइलों को स्थानांतरित करता है। - Damien


"सरलतम" की आपकी परिभाषा यहां महत्वपूर्ण है - सरल कोड का अर्थ मॉड्यूल का उपयोग करना है (हालांकि "बड़ी बाहरी लाइब्रेरी" एक असाधारण है)।

मेरा मानना ​​है कि सबसे अद्यतित (सक्रिय रूप से विकसित) मॉड्यूल है paramiko। यह डाउनलोड में डेमो स्क्रिप्ट के साथ आता है, और विस्तृत ऑनलाइन एपीआई दस्तावेज है। आप भी कोशिश कर सकते हैं PxSSH, जो में निहित है pexpect। पहले लिंक पर प्रलेखन के साथ एक छोटा सा नमूना है।

सादगी के संबंध में, ध्यान दें कि अच्छी त्रुटि-पहचान हमेशा आपके कोड को अधिक जटिल बनाने जा रही है, लेकिन आप नमूना स्क्रिप्ट से बहुत सारे कोड का पुन: उपयोग करने में सक्षम होना चाहिए और फिर इसके बारे में भूल जाएं।


8
2017-08-05 14:44





हूघड्राउन की तरह, मुझे फैब्रिक पसंद है। कृपया ध्यान दें कि यह अपनी घोषणात्मक स्क्रिप्टिंग (तैनाती और इस तरह के लिए) को लागू करने के दौरान इसे एक पायथन मॉड्यूल के रूप में भी आयात किया जा सकता है और फैब्रिक स्क्रिप्ट लिखने के बिना आपके प्रोग्राम पर उपयोग किया जा सकता है।

फैब्रिक का एक नया रखरखाव है और इसे पुनर्जीवित करने की प्रक्रिया में है; इसका मतलब है कि वेब पर पाए जाने वाले अधिकांश ट्यूटोरियल वर्तमान संस्करण के साथ काम नहीं करेंगे। साथ ही, Google अभी भी पुराने फैब्रिक पेज को पहले परिणाम के रूप में दिखाता है।

अद्यतित दस्तावेज के लिए आप जांच सकते हैं: http://docs.fabfile.org


6
2017-08-06 10:08



फैब्रिक paramiko का एक कांटा का उपयोग करता है pypi.python.org/pypi/ssh सभी एसएसएच सामान के लिए। - Damien


मैंने पैरामीको को बहुत कम स्तर वाला पाया, और कपड़ा विशेष रूप से पुस्तकालय के रूप में उपयोग करने के लिए उपयुक्त नहीं है, इसलिए मैंने अपनी खुद की लाइब्रेरी को एक साथ रखा प्रेरणा जो थोड़ा अच्छा इंटरफ़ेस लागू करने के लिए paramiko का उपयोग करता है:

import spur

shell = spur.SshShell(hostname="localhost", username="bob", password="password1")
result = shell.run(["echo", "-n", "hello"])
print result.output # prints hello

आप प्रोग्राम के आउटपुट को चलाने के रूप में प्रिंट करना भी चुन सकते हैं, जो उपयोगी है, यदि आप लंबे समय से चलने वाले कमांड के आउटपुट को बाहर निकलने से पहले देखना चाहते हैं:

result = shell.run(["echo", "-n", "hello"], stdout=sys.stdout)

6
2018-01-10 21:47



चल रहे गैर मानक आदेशों का समर्थन नहीं करता है, उदाहरण के लिए कुछ राउटर (मिक्रोटीक) कमांड पर '/' के साथ उपसर्ग किया गया है, यह लाइब्रेरी एक त्रुटि फेंकता है। मानक लिनक्स होस्ट के लिए, हालांकि यह बहुत अच्छा लगता है। - Babken Vardanyan
जब मैं मेजबाननाम में एक आईपी पता पास करता हूं तो यह एक त्रुटि फेंकता है कि आईपी ज्ञात_होस्ट में नहीं मिला था ... - rexbelia
@rexbelia यह एसएसएच का सामान्य व्यवहार है: यह सुनिश्चित करने के लिए कि आप सही सर्वर से बात कर रहे हैं, एसएसएच केवल मेजबान से कुंजी स्वीकार करेगा यदि यह पहले से ही ज्ञात है। समाधान या तो ज्ञात_होस्ट्स को प्रासंगिक कुंजी जोड़ने के लिए है, या अनुपलब्ध मान को अनुपलब्ध मान पर सेट करने के लिए, अनुपलब्ध मान को सेट करने के लिए है। - Michael Williamson


यह मेरे लिए काम किया

import subprocess
import sys
HOST="IP"
COMMAND="ifconfig"

def passwordless_ssh(HOST):
        ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],
                       shell=False,
                       stdout=subprocess.PIPE,
                       stderr=subprocess.PIPE)
        result = ssh.stdout.readlines()
        if result == []:
                error = ssh.stderr.readlines()
                print >>sys.stderr, "ERROR: %s" % error
                return "error"
        else:
                return result

1
2017-12-22 08:51