यह स्टैक ओवरव्लो में मेरी पहली पोस्ट है, इसलिए मुझे यह सही तरीके से करने की उम्मीद है! :)रिमोट मशीन में पैरामीको के साथ 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()))
लेकिन इसके साथ, यह वास्तव में स्थानीय निर्देशिका सूची को कमांड के रूप में चलाने की कोशिश करता है (जो वास्तव में समझ में आता है कि मेरे पास यह तरीका है)। मुझे सूची को स्ट्रिंग में कनवर्ट करना पड़ा क्योंकि मेरे पास टाइपरर कह रहा था कि यह एक स्ट्रिंग या रीड-ओनली कैरेक्टर बफर की अपेक्षा करता है, सूची नहीं ... मुझे पता है कि यह फ़ंक्शन पास करने का एक बेताब प्रयास था ... क्या करता है किसी को पता है कि मैं ऐसी चीज कैसे कर सकता हूं (रिमोट मशीन पर इसे निष्पादित करने के लिए पैरामीको के माध्यम से स्थानीय फ़ंक्शन पास करें)? यदि आपके पास कोड पर कोई सुधार या सुझाव हैं, तो वे बहुत स्वागत करते हैं (वास्तव में, किसी भी प्रकार की सहायता की बहुत सराहना की जाएगी!)।
बहुत पहले से धन्यवाद! :)
चेक इस [सवाल] (http://stackoverflow.com/questions/8764895/recursively-execute-a-locally-defined-python-script-on-remote-machines) – Bula
@Bula, बहुत बहुत शुक्रिया । अब मैं फैब्रिक में ऐसा करने के लिए स्विच कर रहा हूँ! – eberbis