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


82

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

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

जवाबों:


42

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

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

अपडेट करें:

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


अच्छा खोजो! जब तक आप त्रुटि प्रतिक्रियाओं को अनुकूलित करने के बारे में परवाह नहीं करते हैं, तब तक यह अतिरिक्त अमूर्तता बहुत उपयोगी होगी।
कैस्केबेल

Ssh मॉड्यूल ने चाल चली। सरल और ठीक काम करता है। Paramiko API के माध्यम से कोई खोज नहीं।
क्रिस्टोफर टोकर

2
आपके द्वारा दिए गए लिंक के अंदर ssh.py फ़ाइल का लिंक टूटा हुआ है: /
dgorissen

हाँ, क्या हमारे पास एक नया लिंक हो सकता है। मुझे gshub पर ssh.py मिला, लेकिन यह समान नहीं है (और उतना अच्छा नहीं है)
joedborg

1
Pysftp पैकेज केवल SFTP प्रदान करता है। एक SSH क्लाइंट से बहुत दूर।
bortzmeyer

61

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

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

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

ऐप यहां हुआ करता था । यह अब यहां पाया जा सकता है

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

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

कपड़े के साथ Django तैनात

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

कपड़े और Virtualenv के साथ सरल और आसान तैनाती


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

$ 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...

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


जैसा कि यह एक दिलचस्प लिंक लगता है, मैं इसे अपडेट करना चाहूंगा क्योंकि आपका अब टूट गया है। कृपया उपयोग करें: clemesha.org/blog/…
dlewin

क्या पूछने वाले ने निर्दिष्ट नहीं किया कि वह "बड़े बाहरी पुस्तकालय" का उपयोग नहीं करना चाहता है? जब सभी लेखक वास्तव में पूछते हैं तो परमिको और फैब्रिक दोनों ओवरकिल होते हैं, यह एक सरल-बंद ssh नुस्खा है।
ज़ोरन पावलोविच

1
@Zoran Pavlovic: सभी उत्तर या तो एक स्थानीय पैकेज (पैरामिको, फैब्रिक, ssh, libssh2) को स्थापित करने के लिए या ssh को चलाने के लिए उपप्रकार का उपयोग करने के लिए थे। उत्तरार्द्ध एक स्थापित करने वाला समाधान नहीं है, लेकिन मुझे नहीं लगता कि स्पशिंग एसएच एक महान विचार है, और न ही ओपी के बाद से उन्होंने एसएचएस मॉड्यूल स्थापित करने के लिए उत्तर का चयन किया। वे डॉक्स कहते हैं: "ssh.py तीन सामान्य SSH ऑपरेशन प्रदान करता है, प्राप्त करें, डालें और निष्पादित करें। यह Paramiko पर एक उच्च-स्तरीय अमूर्तता है।" इसलिए जब तक आप libssh2 का पक्ष नहीं लेते हैं, जो कोडिंग पर भारी है, कोई अनुरूप सिफारिश नहीं है। जब ओपी की शर्तों को यथोचित रूप से पूरा नहीं किया जा सकता है तो मैं एक अच्छा समाधान देने का पक्षधर हूं।
hughdbrown

24

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

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

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


7
लेकिन क्या होगा अगर क्लाइंट विंडोज पर है?
नाथन

sshएक पाइप के माध्यम से सबप्रोसेस करने के लिए पासवर्ड की आपूर्ति करना मुश्किल हो सकता है । देखें कि बस एक पाइप (पॉपेन ()) का उपयोग क्यों नहीं किया जाता है? । आप की आवश्यकता हो सकती pty, pexpectमॉड्यूल यह वैकल्पिक हल के लिए।
jfs

doesn't स्ट्रिंग ssh somecomputer के लिए काम करने लगते हैं; अजगर-सी "आयात सुन्न, प्रिंट सुन्न ।__ वर्जन__" यह कहता है कि यह कमांड "आयात" को नहीं जानता है
usethedeathstar

1
@usethedeathstar: पूरे रिमोट कमांड को कोट में लपेटें: ssh somecomputer 'python -c "" इसे आयात करें, इसे प्रिंट करें ""
नील

17

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

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)

2
यह बहुत निचले स्तर का लगता है। उदाहरण के लिए (आपका अपना उदाहरण), आपको स्पष्ट रूप से कहना होगा कि आप IPv4 या IPv6 का उपयोग करें (कुछ ऐसा जो आपको OpenSSH कमांड-लाइन क्लाइंट के साथ नहीं करना है)। इसके अलावा, मैंने यह नहीं पाया कि इसे एसश-एजेंट के साथ कैसे काम किया जाए।
bortzmeyer

2
Pylibssh2 के बारे में अच्छी बात यह है कि यह फ़ाइलों को किसी भी मूल पायथन कार्यान्वयन की तुलना में तेज़ी से पारायिकोको की तरह लागू करता है।
डेमियन

8

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

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

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


6

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

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

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


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

6

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

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)

गैर-मानक आदेशों को चलाने का समर्थन नहीं करता है, उदाहरण के लिए कुछ राउटर्स (मिक्रोटिक) आदेशों को '/' के साथ उपसर्ग किया जाता है, यह लाइब्रेरी एक त्रुटि फेंकता है। मानक लिनक्स होस्ट के लिए, यह बहुत अच्छा लगता है।
बब्बन वर्दयान

जब मैं होस्टनाम के लिए एक आईपी पता पास करता हूं तो यह एक त्रुटि कहती है कि आईपी
ज्ञात_होस्ट्स

@ ग्रिडबेलिया यह SSH का सामान्य व्यवहार है: यह सुनिश्चित करने के लिए कि आप सही सर्वर से बात कर रहे हैं, SSH केवल होस्ट से कुंजी को स्वीकार करेगा यदि यह पहले से ही ज्ञात हो। डॉक्यूमेंट में बताए अनुसार समाधान या तो जान-पहचान के प्रासंगिक कुंजी को जोड़ने के लिए है, या अनुपलब्ध_होस्ट तर्क को उचित मूल्य पर सेट करने के लिए है।
माइकल विलियमसन

4

उन लोगों के लाभ के लिए, जो अजगर ssh नमूने के लिए यहां पहुंचते हैं। मूल प्रश्न और उत्तर अब लगभग एक पुराना है। ऐसा लगता है कि पैरामिको में थोड़ी सी कार्यक्षमता है (ठीक है। मैं मानता हूँ - शुद्ध अनुमान यहाँ - मैं पायथन के लिए नया हूँ) और आप सीधे paramiko के साथ ssh क्लाइंट बना सकते हैं।

import base64
import paramiko

client = paramiko.SSHClient()

client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('192.168.1.1', username='user', password='password')
stdin, stdout, stderr = client.exec_command('cat /proc/meminfo')
for line in stdout:
    print('... ' + line.strip('\n'))
client.close()

यह कोड https://github.com/paramiko/paramiko के डेमो से अनुकूलित किया गया था। यह मेरे लिए काम करता है।


1

इसने मेरे लिए काम किया

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

please refer to paramiko.org, its very useful while doing ssh using python.

import paramiko

import time

ssh = paramiko.SSHClient() #SSHClient() is the paramiko object</n>

#Below lines adds the server key automatically to know_hosts file.use anyone one of the below

ssh.load_system_host_keys() 

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

try:

#Here we are actually connecting to the server.

ssh.connect('10.106.104.24', port=22, username='admin', password='')

time.sleep(5)

#I have mentioned time because some servers or endpoint prints there own information after 
#loggin in e.g. the version, model and uptime information, so its better to give some time 
#before executing the command.

#Here we execute the command, stdin for input, stdout for output, stderr for error

stdin, stdout, stderr = ssh.exec_command('xstatus Time')

#Here we are reading the lines from output.

output = stdout.readlines() 

print(output)


#Below all are the Exception handled by paramiko while ssh. Refer to paramiko.org for more information about exception.


except (BadHostKeyException, AuthenticationException,  
    SSHException, socket.error) as e:           

print(e)

0

स्परप्लस पर एक नज़र डालें , स्पर और पैरामिको के चारों ओर एक आवरण जो हमने दूरस्थ मशीनों का प्रबंधन करने और फ़ाइल संचालन करने के लिए विकसित किया है।

स्पर्प्लस एक check_output()कार्य-आउट-द-बॉक्स प्रदान करता है :

import spurplus
with spurplus.connect_with_retries(
        hostname='some-machine.example.com', username='devop') as shell:
     out = shell.check_output(['/path/to/the/command', '--some_argument']) 
     print(out)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.