使用Python与远程计算机连接

时间:2009-08-19 22:49:10

标签: python networking monitoring

我刚刚成为我的研究小组的系统管理员,在这方面,我是新手。我正在尝试制作一些工具来监控网络,并需要帮助开始使用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之类的东西来获取节点的处理器信息。一个起点真的很棒。感谢。

6 个答案:

答案 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:

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

答案 1 :(得分:2)

我一直在使用Pexpect,让你成功进入机器,发送命令,读取输出并做出反应。我甚至创建了一个围绕它的开源项目,Proxpect - 它已经很久没有更新了,但我离题了......

答案 2 :(得分:1)

pexpect模块可以帮助您与ssh交互。或多或少,这是你的例子。

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

答案 3 :(得分: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进行ssh调用完全没问题,或者只是不想运行单独的“RPyC”守护进程,那么这绝对是一种过度杀伤。

答案 4 :(得分:0)

这涵盖了基础。注意使用sudo来处理需要更多权限的事情。我们将sudo配置为允许该用户使用这些命令而无需输入密码。

另外,请记住,您应该运行ssh-agent以使其“有意义”。但总而言之,它运作得非常好。运行deploy-control httpd configtest将检查所有远程服务器上的apache配置。

#!/usr/local/bin/python

import subprocess
import sys

# The user@host: for the SourceURLs (NO TRAILING SLASH)
RemoteUsers = [
        "deploy@host1.example.com",
        "deploy@host2.appcove.net",
        ]

###################################################################################################
# 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)

答案 5 :(得分:0)

Fabric是一种简单的方法来自动完成这样的一些简单任务,我目前使用的版本允许你像这样包装命令:

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

您可以为您需要的每台计算机指定配置选项(config.fab_user,config.fab_password)(如果您想自动执行用户名密码处理)。

有关Fabric的更多信息:

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

有一个更新版本的Pythonic - 我不确定这对你来说是否会更好......目前我的工作正常......