2009-08-19 5 views
5

私はちょうど私の研究グループのクラスタのシステム管理者になりました。この点では初心者です。私は、ネットワークを監視するためのツールをいくつか作成しようとしており、Python(私の母国語)でそれらを実装するのを手助けする必要があります。Pythonを使用したリモートコンピュータとのインターフェイス

たとえば、リモートマシンにログオンしているユーザーを確認したいとします。手で、私はsshとwho、しかし、私は操作のためのスクリプトにこの情報を得るだろうか?何かのように、ノードのプロセッサ情報を取得するためのcat /proc/cpuinfoのようなもののために同様に

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) 

。出発点は本当に素晴らしいでしょう。ありがとう。

答えて

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のために:私はPexpectを使用してきた

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

ニース。これは私が仕事を始めた最初のコードでした。質問:ssh接続がいつ終了するのか知っていますか?コマンドを実行した直後に – physicsmichael

+0

。 – Peter

+0

@Peter:リモートホスト(プロンプトなどでの回答)とのやりとりが必要な場合は、Pexpectを使用するか、そのような機能を備えた組み込みのライブラリが必要です。 – legesh

2

、あなたはマシンにsshを入れてコマンドを送信し、出力を読んで、それに反応して成功させましょう。私もそれを中心にオープンソースプロジェクトを始めました。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とインターフェースを助けることができます。多かれ少なかれ、あなたの例がどのように見えるかがここにあります。 (あなたが設定オプションを指定することができます

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

設定を:

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

これは問題ありませんが、このような認証は一般的に悪いアイデアとみなされます。公開鍵ベースのSSH認証はより安全です...そして、少なくともあなたは、誤って編集するたびにあなたのスクリプトが世界中で読めるようにする必要はありません。 – drdaeman

+0

'child.sendline( 'who')'の出力は数字4のようです...何が欠けていますか? – physicsmichael

+0

私はpexpectと同じものを手に入れました。 – Jon

0

ファブリックは、このようないくつかの単純なタスクを自動化するための簡単な方法ですが、私は現在使用しているバージョンは、あなたがそうのようなコマンドをラップすることができます.fab_user、config.fab_password)を入力します(ユーザ名のパスワード処理を自動化したい場合)。ここではファブリック上の

さらに詳しい情報:

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

よりPython的で新しいバージョンがあります - 私はそれはあなたが彼のケースをint型のために良いことが起こっているかどうかわからないが...作品今のところ私のためにうまく...

1

あなたのニーズが単純に "ssh remote-host.example.org who"を超えると、RPyCという素晴らしいPythonライブラリがあります。これは、古典的なモードと呼ばれ、いくつかのコード行でほぼ透過的に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を使ってsshを呼び出すことで完璧にやっているのであれば、別の "RPyC"デーモンを実行したくない場合は、間違いなく過剰です。

関連する問題