2009-08-19 46 views
5

我剛剛成爲我的研究組羣的系統管理員,在這方面,我是一名新手。我試圖做一些工具來監控網絡,需要幫助開始使用python(我的母語)來實現它們。與使用Python的遠程計算機的接口

例如,我想查看誰登錄到遠程機器上。手動,我會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

尼斯。這是我開始工作的第一個代碼。問題:你知道什麼時候ssh連接終止了嗎? – physicsmichael 2009-08-20 00:41:37

+0

運行命令後。 – Peter 2009-08-20 00:42:41

+0

@Peter:如果我需要與遠程主機(上提示的答案,等等)的相互作用,我應該使用Pexpect的或有一個內置的庫這樣的功能 – legesh 2009-09-06 08:08:13

2

我一直在使用Pexpect,這讓你可以進入機器,發送命令,讀取輸出,並對它做出反應,並取得成功。我甚至開始圍繞它開發一個開源項目,Proxpect - 這些項目在很久以前都沒有更新過,但我離題了......

0

這涵蓋了基地。注意sudo用於需要更多權限的事情。我們配置了sudo以允許那些用戶使用這些命令,而不需要輸入密碼。

另外,請記住,你應該運行ssh-agent來使這個「有道理」。但總而言之,它運作得非常好。運行deploy-control httpd configtest將檢查所有遠程服務器上的apache配置。

#!/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

這是罰款的例子,但請注意,驗證像通常認爲這是一個壞主意。基於公鑰SSH認證更安全......而且至少你不必確保你的腳本不是全局可讀的每一個偶然的編輯之後。 – drdaeman 2009-08-19 23:30:10

+0

child.sendline的'輸出(「誰」)'好像是4號......我在想什麼? – physicsmichael 2009-08-19 23:41:08

+0

我買了Pexpect的一樣,有什麼用它給? – Jon 2009-08-20 04:56:54

0

面料是自動化一些簡單的任務這樣一個簡單的方法,我目前使用的版本,可以讓你包裹起來的命令,像這樣:

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

您可以指定配置選項(配置.fab_user,config.fab_password)爲你需要的每臺機器(如果你想自動化用戶名密碼處理)。在這裏布

更多信息:

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

有一個新的版本,這是更Python - 我不知道這是否將是更好地爲您詮釋他的案件......作品對我來說目前...

1

如果您的需求超過簡單的「ssh remote-host.example.org who」,那麼有一個很棒的python庫,名爲RPyC。它有所謂的「經典」模式,它允許通過幾行代碼在網絡上幾乎透明地執行Python代碼。非常有用的工具可信賴的環境。

下面是一個例子,從維基百科:

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或只是不希望運行單獨的「RPyC」守護進程是使用ssh呼叫完美的罰款,那麼這絕對是矯枉過正。