2013-12-10 14 views
19

पर स्थानीय पायथन स्क्रिप्ट चलाएं मैं कुछ वर्चुअल मशीन पर चलने वाली कुछ पायथन स्क्रिप्ट डिबग कर रहा हूं। और, मैं स्थानीय रूप से स्क्रिप्ट संपादित करना पसंद करता हूं (आभासी मशीनों के बाहर)। तो मुझे लगता है कि यह थकाऊscp वर्चुअल मशीनों में संशोधित स्क्रिप्ट हर बार है। क्या कोई कुछ प्रभावी तरीके से सुझाव दे सकता है?रिमोट सर्वर

विशेष रूप से, मुझे आश्चर्य है कि रिमोट पीवीएम पर पाइथन स्क्रिप्ट निष्पादित करना संभव है या नहीं। कुछ ऐसा:

python --remote [email protected] hello.py //**FAKED**, served to explain ONLY 

उत्तर

37

एसएसएच का उपयोग करना संभव है। , तर्क मानक इनपुट निष्पादित करने के लिए के रूप में

cat hello.py | ssh [email protected] python - 

रन अधिक जानकारी के लिए अजगर --help - अजगर हाइफन स्वीकार करता है()।

+0

क्या आप '-' नहीं छोड़ सकते? यह बिना मेरे लिए ठीक काम करता है। –

+1

क्या होगा यदि कोड उपफोल्डर में स्थित submodules है? –

+2

इस मामले में आप कमांड लाइन तर्क कहां जोड़ देंगे? – ubundows

3

आप इसे एसएसएच के माध्यम से कर सकते हैं।

ssh [email protected] "python ./hello.py"

तुम भी एक टेक्स्ट संपादक या X11 अग्रेषण का उपयोग कर ssh में स्क्रिप्ट को संपादित कर सकते हैं।

+4

नहीं है। जैसा कि मैं समझता हूं कि लेखक रिमोट सर्वर पर _local_ पायथन स्क्रिप्ट निष्पादित करना चाहता है। – Sney

+0

हाँ, आप सही हैं। मैं "अपलोड चरण" से बचने के लिए सीधे रिमोट मशीन पर एसएसएच के माध्यम से संपादन करने का सुझाव दे रहा था। वास्तव में आप फ़ाइल को एक पंक्ति में अपलोड और निष्पादित कर सकते हैं (उदा। Http://unix.stackexchange.com/a/57809)। लेकिन वह समाधान मेरे लिए थोड़ा गंदा लग रहा है ... – smeso

25

हालांकि यह प्रश्न काफी नया नहीं है और एक उत्तर पहले से ही चुना गया था, मैं एक और अच्छा दृष्टिकोण साझा करना चाहता हूं।

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

मेरी स्थानीय मशीन पर, मैं एक cmd-line पैरामीटर 'तैनाती' के साथ स्क्रिप्ट चलाता हूं, जो रिमोट निष्पादन को ट्रिगर करता है। ऐसे पैरामीटर के बिना, रिमोट होस्ट के लिए लक्षित वास्तविक कोड चलाया जाता है।

import sys 
import os 

def main(): 
    print os.name 

if __name__ == '__main__': 
    try: 
     if sys.argv[1] == 'deploy': 
      import paramiko 

      # Connect to remote host 
      client = paramiko.SSHClient() 
      client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
      client.connect('remote_hostname_or_IP', username='john', password='secret') 

      # Setup sftp connection and transmit this script 
      sftp = client.open_sftp() 
      sftp.put(__file__, '/tmp/myscript.py') 
      sftp.close() 

      # Run the transmitted script remotely without args and show its output. 
      # SSHClient.exec_command() returns the tuple (stdin,stdout,stderr) 
      stdout = client.exec_command('python /tmp/myscript.py')[1] 
      for line in stdout: 
       # Process each line in the remote output 
       print line 

      client.close() 
      sys.exit(0) 
    except IndexError: 
     pass 

    # No cmd-line args provided, run script normally 
    main() 

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

+0

क्या मैं इस निर्माण का उपयोग ओपन paramiko.SSHClien() के साथ कर सकता हूं ... 'बंद() को भूलने से बचने के लिए? – Mrlenny

+0

उस लेन को जांचें (sys.argv)> 1, अन्यथा रिमोट पर स्क्रिप्ट क्रैश हो जाती है। इसके अलावा, रिमोट पर आपके bashrc (या खोल प्रारंभिक कॉन्फ़िगरेशन) में stdout (bash में गूंज) पर कोई भी प्रिंट नहीं होना चाहिए। –

0

मुझे पैरामीको का उपयोग करने से पहले ऐसा करना पड़ा, जहां मैं एक एसएसएच सर्वर चलाने वाले मेजबान पर एक गतिशील, स्थानीय पीईक्यूटी 4 स्क्रिप्ट चलाने के लिए चाहता था, जिसने मेरा ओपनवीपीएन सर्वर कनेक्ट किया है और अपनी रूटिंग वरीयता मांगना है (विभाजित सुरंग)।

तब तक जब तक आप जिस एसएसएच सर्वर से कनेक्ट हो रहे हैं, आपकी स्क्रिप्ट की सभी आवश्यक निर्भरताएं हैं (मेरे मामले में पीईक्यूटी 4), आप आसानी से बेस 64 में एन्कोडिंग करके डेटा को समाहित कर सकते हैं और exec() अंतर्निहित फ़ंक्शन का उपयोग कर सकते हैं डीकोडेड संदेश। अगर मैं सही ढंग से याद इस के लिए मेरे एक लाइनर था:

stdout = client.exec_command('python -c "exec(\\"' + open('hello.py','r').read().encode('base64').strip('\n') + '\\".decode(\\"base64\\"))"')[1] 

यह पढ़ने के लिए कठिन है और आप बच दृश्यों से बचने के लिए है क्योंकि वे दो बार (एक बार प्रेषक द्वारा फिर से रिसीवर द्वारा और उसके बाद) समझा जाता है। इसे कुछ डिबगिंग की भी आवश्यकता हो सकती है, मैंने अपने सर्वर को पीसीएस पर पैक किया है या मैं बस अपनी ओपनवीपीएन रूटिंग स्क्रिप्ट का संदर्भ दूंगा।

फ़ाइल भेजने के विरोध में ऐसा करने में अंतर यह है कि यह सर्वर पर डिस्क को कभी भी छूता नहीं है और सीधे स्मृति से चलाया जाता है (जब तक कि वे कमांड को लॉग इन नहीं करते)। आपको यह पता चल जाएगा कि इस तरह से encapsulating जानकारी (हालांकि अक्षम) आपको डेटा को एक फ़ाइल में पैकेज करने में मदद कर सकती है।

उदाहरण के लिए, आप अपनी मुख्य स्क्रिप्ट में बाह्य निर्भरताओं (यानी एक छवि) से कच्चे डेटा को शामिल करने के लिए इस विधि का उपयोग कर सकते हैं।

5
ssh [email protected] python < script.py - arg1 arg2 

यह दूरस्थ सर्वर पर एक _remote_ अजगर स्क्रिप्ट निष्पादित करता है क्योंकि cat | आम तौर पर आवश्यक

संबंधित मुद्दे