2011-06-16 15 views
9

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

  • सीपी प्रत्येक नोड पर दूरस्थ नोड्स स्थानीय मशीन से फाइल
  • रन एक कार्यक्रम
  • अपने स्थानीय मशीन के लिए नोड से फ़ाइलों को पुनः प्राप्त
  • हो सकता है कि एक फोर्टन प्रोग्राम पर प्रतिलिपि बनाना और इसे नोड्स पर संकलित करना और नोड्स को जांचना भी संभव है कि कोई प्रोग्राम चल रहा है या नहीं।

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

मैं परमिको को देख रहा था लेकिन मुझे पता नहीं लगा कि मैं अपनी स्थानीय मशीन से नोड्स तक पहुंचने के लिए इसका उपयोग कैसे कर सकता हूं क्योंकि मुझे सर्वर से गुज़रना होगा। स्थानीय -ssh -> सर्वर -ssh -> नोड्स

वहाँ अजगर में यह करने के लिए एक रास्ता है या मैं जैसे कुछ और प्रयास करने चाहिए: का उपयोग कर:

os.system(ssh -t server ssh node 'command') 

या एक पार्टी बना प्रत्येक अलग-अलग कमांड (compile.sh, move_inputs.sh, retrieve_outputs.sh) के लिए सर्वर पर स्क्रिप्ट और फिर बस सर्वर से कनेक्ट हो रही है और बैश स्क्रिप्ट चला रही है।

क्षमा करें अगर यह समझ में नहीं आता है या यदि यह बुरी तरह से बुलाया जाता है, तो किसी भी मदद की सराहना की जाती है।

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

उत्तर

7

आपको ऐसा करने के लिए पाइथन की आवश्यकता नहीं है। ProxyCommand configuration option for SSH देखें। यहां एक tutorial है जो विवरण बताता है।

+0

मैं इस पर गौर करेंगे इस। कारण मैं पाइथन का उपयोग कर रहा हूं क्योंकि मैं चाहता हूं कि प्रोग्राम इनपुट फाइलें बनाने में सक्षम हो, उन्हें नोड्स पर भेज दें और आउटपुट फाइलों को पुनः प्राप्त करें, और अंत में हमारे डेटा के ग्राफ उत्पन्न करें। मेरे इनपुट फाइलें उत्पन्न करने और आउटपुट से आलेख बनाने के लिए मेरे पास पहले से कुछ कोड है। – Russss

+0

हालांकि मैंने इसका परीक्षण नहीं किया है, मुझे पूरा यकीन है कि प्रॉक्सी कॉमांड के साथ एसएसएच कॉन्फ़िगरेशन भी काम करेगा यदि आप पायथन से एसएसएच करते हैं। – badzil

5

मेरे सहयोगी से एक चाल के साथ, आप सीधे स्थानीय से नोड्स तक ssh/scp कर सकते हैं। अपने ~/.ssh/config

संपादित करें:

Host * 
ControlMaster auto 
ControlPath ~/.ssh/master-%[email protected]%h:%p 

Host node1 node2 or node* 
ProxyCommand ssh server 'nc -w 5 %h 22' 

मज़ा!

+0

मैं यह भी करता हूं, लेकिन कंट्रोलमास्टर दृष्टिकोण में कुछ कमियां हैं। यह एक अच्छा सारांश है: http://www.anchor.com.au/blog/2010/02/ssh-controlmaster-the-good-the-bad-the-ugly/ – Mzzzzzz

1

उपयोग plink [email protected] -pw password ls -l

डाउनलोड plink और अपने विंडोज़ मशीन पर प्रतिलिपि

3

आप नोड के लिए अपने सर्वर के माध्यम से एक सुरंग बनाकर ऐसा कर सकते हैं:

import os, sys, shlex 
import subprocess 
import paramiko 

cmd = "ssh -f -N -p " + str(serverport) + " -l " + serveruser + " -L " + str(tunnelport) + ":" + nodehost + ":" + str(nodeport) + " " + serverhost 
args = shlex.split(cmd) 
tun = subprocess.Popen(args) 
stat = tun.poll() 

एक बार सुरंग है सेट अप करें आप नोड्स को ftp कर सकते हैं:

transport = paramiko.Transport(("127.0.0.1", tunnelport)) 
transport.connect(username=nodeusername, password=nodepw) 
sftp = paramiko.SFTPClient.from_transport(transport) 
sftp.put(localfile, remotefile) 

या आप paramiko.SSHClient() से कनेक्ट कमांड को कनेक्ट और निष्पादित कर सकते हैं। कनेक्ट करें ("127.0.0.1", पोर्ट = पोर्ट, उपयोगकर्ता नाम = उपयोगकर्ता, पासवर्ड = पीडब्ल्यू) और paramiko.SSHClient()। exec_command (कमांड)।

फिर सुरंग प्रक्रिया इस प्रकार मार डाला जा सकता है:

p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE) 
out, err = p.communicate() 
for line in out.splitlines(): 
    if cmd in line: 
     pid = int(line.split(None, 1)[0]) 
     os.kill(pid, signal.SIGKILL) 
3

आप Paramiko साथ यह कर सकते हैं:

proxy_command = 'ssh -i %s %[email protected]%s nc %s %s' % (proxy_key, proxy_user, proxy_host, host, 22) 

proxy = paramiko.ProxyCommand(proxy_command) 

client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
client.connect(host, username=user, password=password, sock=proxy) 

stdin, stdout, stderr = client.exec_command('echo HELLO') 
print "Echo: %s" % (", ".join(stdout.readlines())) 
client.close() 

यह बहुत SFTPClient साथ काम करता है:

proxy_command = 'ssh -i %s %[email protected]%s nc %s %s' % (proxy_key, proxy_user, proxy_host, host, 22) 

proxy = paramiko.ProxyCommand(proxy_command) 

transport = paramiko.Transport(proxy) 
transport.connect(username=user, password=password) 

sftp = paramiko.SFTPClient.from_transport(transport) 
संबंधित मुद्दे