2009-08-19 5 views
5

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

उदाहरण के लिए, मैं देखना चाहता हूं कि दूरस्थ मशीनों पर कौन लॉग है। हाथ से, मैं ssh और who चाहता हूं, लेकिन मैनिपुलेशन के लिए मुझे यह जानकारी स्क्रिप्ट में कैसे प्राप्त होगी? कुछ की तरह,

import remote_info as ri 
ri.open("foo05.bar.edu") 
ri.who() 

Out[1]: 
hutchinson tty7   2009-08-19 13:32 (:0) 
hutchinson pts/1  2009-08-19 13:33 (:0.0) 
इसी तरह बातों के लिए cat /proc/cpuinfo तरह

एक नोड के प्रोसेसर जानकारी पाने के लिए। एक शुरुआती बिंदु वास्तव में महान होगा। धन्यवाद।

उत्तर

2

यहाँ एक सरल, सस्ता समाधान है आप

from subprocess import * 
p = Popen('ssh servername who', shell=True, stdout=PIPE) 
p.wait() 
print p.stdout.readlines() 

रिटर्न आरंभ करने के लिए (उदाहरण के लिए)

['usr  pts/0  2009-08-19 16:03 (kakapo)\n', 
'usr  pts/1  2009-08-17 15:51 (kakapo)\n', 
'usr  pts/5  2009-08-17 17:00 (kakapo)\n'] 

और cpuinfo के लिए:

p = Popen('ssh servername cat /proc/cpuinfo', shell=True, stdout=PIPE) 
+0

अच्छा। यह पहला कोड था जो मुझे काम करने के लिए मिला था। प्रश्न: क्या आपको पता है कि एसएसएच कनेक्शन कब समाप्त हो गया है? कमांड चलाने के ठीक बाद – physicsmichael

+0

। – Peter

+0

@ पीटर: अगर मुझे रिमोट होस्ट (प्रॉम्प्ट पर उत्तर, आदि) के साथ एक इंटरैक्शन की ज़रूरत है, तो मुझे पेक्सपेक्ट का उपयोग करना चाहिए या ऐसी कार्यक्षमता – legesh

2

मैं Pexpect उपयोग कर रहे हैं, जो आपको मशीनों में एसएसएच करने देता है, कमांड भेजता है, आउटपुट पढ़ता है, और सफलता के साथ प्रतिक्रिया देता है। मैंने इसके आसपास एक ओपन-सोर्स प्रोजेक्ट भी शुरू किया, Proxpect - जो उम्र में अपडेट नहीं किया गया है, लेकिन मैं digress ...

0

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

इसके अलावा, ध्यान रखें कि आपको इसे "समझदारी" बनाने के लिए एसएसएच एजेंट चलाने चाहिए। लेकिन सब कुछ, यह वास्तव में अच्छी तरह से काम करता है। चल रहा है deploy-control httpd configtest सभी रिमोट सर्वर पर अपाचे कॉन्फ़िगरेशन की जांच करेगा।

#!/usr/local/bin/python 

import subprocess 
import sys 

# The [email protected]: for the SourceURLs (NO TRAILING SLASH) 
RemoteUsers = [ 
     "[email protected]", 
     "[email protected]", 
     ] 

################################################################################################### 
# Global Variables 
Arg        = None 


# Implicitly verified below in if/else 
Command = tuple(sys.argv[1:]) 

ResultList = [] 
################################################################################################### 
for UH in RemoteUsers: 
     print "-"*80 
     print "Running %s command on: %s" % (Command, UH) 

     #---------------------------------------------------------------------------------------------- 
     if Command == ('httpd', 'configtest'): 
       CommandResult = subprocess.call(('ssh', UH, 'sudo /sbin/service httpd configtest')) 

     #---------------------------------------------------------------------------------------------- 
     elif Command == ('httpd', 'graceful'): 
       CommandResult = subprocess.call(('ssh', UH, 'sudo /sbin/service httpd graceful')) 

     #---------------------------------------------------------------------------------------------- 
     elif Command == ('httpd', 'status'): 
       CommandResult = subprocess.call(('ssh', UH, 'sudo /sbin/service httpd status')) 

     #---------------------------------------------------------------------------------------------- 
     elif Command == ('disk', 'usage'): 
       CommandResult = subprocess.call(('ssh', UH, 'df -h')) 

     #---------------------------------------------------------------------------------------------- 
     elif Command == ('uptime',): 
       CommandResult = subprocess.call(('ssh', UH, 'uptime')) 

     #---------------------------------------------------------------------------------------------- 
     else: 
       print 
       print "#"*80 
       print 
       print "Error: invalid command" 
       print 
       HelpAndExit() 

     #---------------------------------------------------------------------------------------------- 
     ResultList.append(CommandResult) 
     print 


################################################################################################### 
if any(ResultList): 
     print "#"*80 
     print "#"*80 
     print "#"*80 
     print 
     print "ERRORS FOUND. SEE ABOVE" 
     print 
     sys.exit(0) 

else: 
     print "-"*80 
     print 
     print "Looks OK!" 
     print 
     sys.exit(1) 
1

pexpect मॉड्यूल मदद कर सकते हैं ssh के साथ इंटरफेस। अधिक या कम, यहां आपका उदाहरण कैसा दिखता है।

child = pexpect.spawn('ssh servername') 
child.expect('Password:') 
child.sendline('ABCDEF') 
(output,status) = child.sendline('who') 
+0

यह उदाहरण के लिए ठीक है, लेकिन कृपया ध्यान दें, इस तरह प्रमाणीकरण को आम तौर पर एक बुरा विचार माना जाता है। सार्वजनिक कुंजी-आधारित एसएसएच प्रमाणीकरण अधिक सुरक्षित है ... और कम से कम आपको यह सुनिश्चित करना नहीं है कि प्रत्येक स्क्रिप्ट के बाद आपकी स्क्रिप्ट विश्व-पठनीय नहीं है। – drdaeman

+0

'child.sendline ('who') का आउटपुट नंबर 4 लगता है ... मुझे क्या याद आ रही है? – physicsmichael

+0

मुझे pexpect के साथ मिल गया, इसके साथ क्या देता है? – Jon

0

फैब्रिक इस तरह की कुछ सामान्य कार्यों को स्वचालित करने के लिए एक आसान तरीका है, संस्करण मैं वर्तमान में उपयोग कर रहा हूँ तुम इतनी तरह आदेशों लपेट के लिए अनुमति देता है:

run('whoami', fail='ignore') 

आप config विकल्प निर्दिष्ट कर सकते (config आपको आवश्यक प्रत्येक मशीन के लिए .fab_user, config.fab_password) (यदि आप उपयोगकर्ता नाम पासवर्ड हैंडलिंग स्वचालित करना चाहते हैं)। यहां कपड़ा पर

और जानकारी:

http://www.nongnu.org/fab/

जो अधिक pythonic एक नया संस्करण नहीं है - मुझे यकीन है कि आप उनके मामले int के लिए बेहतर होने जा रहा है कि क्या नहीं कर रहा हूँ ... काम करता है वर्तमान में मेरे लिए ठीक ...

1

अपनी आवश्यकताओं सरल "ssh remote-host.example.org who" फिर वहाँ एक भयानक अजगर पुस्तकालय है ऊंचा हो जाना, तो RPyC कहा जाता है। इसे "क्लासिक" मोड कहा जाता है जो कोड की कई पंक्तियों के साथ नेटवर्क पर पाइथन कोड को लगभग पारदर्शी रूप से निष्पादित करने की अनुमति देता है। भरोसेमंद वातावरण के लिए बहुत उपयोगी उपकरण।

यहाँ विकिपीडिया से एक उदाहरण है:

import rpyc 
# assuming a classic server is running on 'hostname' 
conn = rpyc.classic.connect("hostname") 

# runs os.listdir() and os.stat() remotely, printing results locally 
def remote_ls(path): 
    ros = conn.modules.os 
    for filename in ros.listdir(path): 
     stats = ros.stat(ros.path.join(path, filename)) 
     print "%d\t%d\t%s" % (stats.st_size, stats.st_uid, filename) 

remote_ls("/usr/bin") 

आप रुचि रखते हैं, वहाँ a good tutorial on their wiki

लेकिन, अगर आप Popen का उपयोग करके एसएसएच कॉल के साथ पूरी तरह ठीक हैं या बस अलग "आरपीईसी" डिमन चलाने की इच्छा नहीं है, तो यह निश्चित रूप से एक ओवरकिल है।