我刚刚成为我的研究小组的系统管理员,在这方面,我是新手。我正在尝试制作一些工具来监控网络,并需要帮助开始使用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
之类的东西来获取节点的处理器信息。一个起点真的很棒。感谢。
答案 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)
答案 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的更多信息:
有一个更新版本的Pythonic - 我不确定这对你来说是否会更好......目前我的工作正常......