2012-11-02 20 views
5

यह स्टैक ओवरव्लो में मेरी पहली पोस्ट है, इसलिए मुझे यह सही तरीके से करने की उम्मीद है! :)रिमोट मशीन में पैरामीको के साथ sshClient() पर स्थानीय पायथन स्क्रिप्ट निष्पादित करें

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

जिस स्क्रिप्ट को मैं उन पर चलाने के लिए चाहता हूं वह अधिकृत_कीज फ़ाइल को संशोधित करता है लेकिन शुरू करने के लिए, मैं इसे केवल एक सर्वर के साथ कोशिश कर रहा हूं और अभी तक उपरोक्त स्क्रिप्ट का उपयोग नहीं कर रहा हूं (मैं गलती नहीं करना चाहता हूं और सर्वर को अवरुद्ध नहीं करना चाहता मेरे पहले कार्य में!)। मैं सिर्फ getDir() नामक एक बहुत ही सरल फ़ंक्शन के साथ दूरस्थ मशीन में निर्देशिका को सूचीबद्ध करने का प्रयास कर रहा हूं। अब तक, मैं paramiko मूलभूत चीज़ों का उपयोग (मैं जिस तरह से स्क्रिप्ट डिबग करने के लिए pdb उपयोग कर रहा हूँ) के साथ सर्वर से कनेक्ट कर लिया है:

try_paramiko.py

#!/usr/bin/python 

import paramiko 
from getDir import get_dir 
import pdb 


def try_this(server): 
    pdb.set_trace() 
    ssh = paramiko.SSHClient() 
    ssh.load_host_keys("pth/to/known_hosts") 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    my_key = paramiko.RSAKey.from_private_key_file("pth/to/id_rsa") 
    ssh.connect(server, username = "root", pkey = my_key) 
    i, o, e = ssh.exec_command(getDir()) 

यह वह जगह है डिबगिंग जब मैं बजाय रिमोट मशीन से एक के अपने स्थानीय मशीन की सूची सूची मिल गया

getDir.py

#!/usr/bin/python 

import os 
import pdb 


def get_dir(): 
    pdb.set_trace() 
    print "Current dir list is:" 
    for item in os.listdir(os.getcwd()): 
     print item 

... वहाँ एक तरीका है: समारोह निर्देशिका सूची प्राप्त करने के paramiko के माध्यम से एक पायथन समारोह के रूप में एक पायथन समारोह पारित करने के लिए? तब से इसे चलाने

ssh -i pth/to/key [email protected] 'bash -s' < script.sh 
तो

वास्तव में हर मशीन के लिए अजगर स्क्रिप्ट कॉपी और से बचने के लिए: मैं बस स्थानीय स्तर पर स्क्रिप्ट है और यह दूर से चलाने की तरह है जब आप के साथ ssh से एक बैश फ़ाइल के साथ यह करना चाहते हैं उन्हें (मुझे लगता है कि उपरोक्त आदेश के साथ स्क्रिप्ट को दूरस्थ मशीन पर भी कॉपी किया जाएगा और फिर हटा दिया जाएगा, है ना?) क्या paramiko.sshClient() के साथ ऐसा करने का कोई तरीका है?

try_paramiko.py

#!/usr/bin/python 

import paramiko 
from getDir import get_dir 
import pdb 


def try_this(server): 
    pdb.set_trace() 
    ssh = paramiko.SSHClient() 
    ssh.load_host_keys("pth/to/known_hosts") 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    my_key = paramiko.RSAKey.from_private_key_file("pth/to/id_rsa") 
    ssh.connect(server, username = "root", pkey = my_key) 
    i, o, e = ssh.exec_command(getDir()) 
    for line in o.readlines(): 
     print line 
    for line in e.readlines(): 
     print line  

getDir.py

:

मैं भी कोड को संशोधित करने और चैनल कि exec_command निर्देशिका सूची की तरह स्क्रिप्ट छोड़ने बनाता है के मानक उत्पादन का उपयोग करने की कोशिश की है

def get_dir(): 
    return ', '.join(os.listdir(os.getcwd())) 

लेकिन इसके साथ, यह वास्तव में स्थानीय निर्देशिका सूची को कमांड के रूप में चलाने की कोशिश करता है (जो वास्तव में समझ में आता है कि मेरे पास यह तरीका है)। मुझे सूची को स्ट्रिंग में कनवर्ट करना पड़ा क्योंकि मेरे पास टाइपरर कह रहा था कि यह एक स्ट्रिंग या रीड-ओनली कैरेक्टर बफर की अपेक्षा करता है, सूची नहीं ... मुझे पता है कि यह फ़ंक्शन पास करने का एक बेताब प्रयास था ... क्या करता है किसी को पता है कि मैं ऐसी चीज कैसे कर सकता हूं (रिमोट मशीन पर इसे निष्पादित करने के लिए पैरामीको के माध्यम से स्थानीय फ़ंक्शन पास करें)? यदि आपके पास कोड पर कोई सुधार या सुझाव हैं, तो वे बहुत स्वागत करते हैं (वास्तव में, किसी भी प्रकार की सहायता की बहुत सराहना की जाएगी!)।

बहुत पहले से धन्यवाद! :)

+0

चेक इस [सवाल] (http://stackoverflow.com/questions/8764895/recursively-execute-a-locally-defined-python-script-on-remote-machines) – Bula

+0

@Bula, बहुत बहुत शुक्रिया । अब मैं फैब्रिक में ऐसा करने के लिए स्विच कर रहा हूँ! – eberbis

उत्तर

4

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

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

के बजाय कर रही है:

def get_dir(): 
    return ', '.join(os.listdir(os.getcwd())) 

i, o, e = ssh.exec_command(getDir()) 

आप कोशिश करना चाहते हो सकता है:

i, o, e = ssh.exec_command('pwd') 
o.printlines() 

+1

आपको बहुत धन्यवाद @mechmind, मैं फैब्रिक पर स्विच करने वाला हूं। आप वास्तव में मेरी मदद करते हैं! मैंने आपके उत्तर में कुछ बिंदु देने की कोशिश की लेकिन मैं अभी भी बहुत कम प्रतिष्ठा बिंदुओं के साथ एक नौसिखिया हूँ! उसके लिए माफ़ करना! – eberbis

2

मुझे लगता है कि आप paramaters आप ssh.exec_command यहाँ में गुजर रहे हैं बदलने के लिए चाहते हो सकता एक विचार है और अन्य चीजों का पता लगाने के लिए:

  • एक बैश स्क्रिप्ट या एक पायथन लिखना जो आपके सर्वर पर रहता है। आप पैरामीको को सर्वर पर लॉग ऑन करने और स्क्रिप्ट को ssh.exec_command(some_script.sh) या ssh.exec_command(some_script.py)
  • पैरामीको में कुछ एफ़टीपी/एसएफटीपी उपयोगिताएं हैं ताकि आप वास्तव में सर्वर पर स्क्रिप्ट डालने के लिए इसका उपयोग कर सकें और फिर इसे निष्पादित कर सकें।
+0

बहुत बहुत धन्यवाद स्टीफन! बात यह है कि मैं फ़ाइल को सभी सर्वरों पर कॉपी करने से बचना चाहता था। मुझे पता था कि मुझे बस सभी सर्वरों पर फ़ाइल को स्कैन करने की संभावना थी, लेकिन मैं इसे इस तरह से नहीं चाहता था। वैसे भी, मैं आपके प्रश्न का उत्तर देने के लिए समय लेने की सराहना करता हूं :) – eberbis