您的位置:首页 > 运维架构 > Linux

批量远程执行linux服务器程序--基于pxpect(多进程、记日志版)

2015-11-13 10:59 543 查看
#!/usr/bin/python

'''
Created on 2015-06-09
@author: Administrator
'''

import pexpect
import os,sys
from optparse import OptionParser
import logging,multiprocessing
import logging.handlers

#menue
usage='%prog [-h][-s Servers][-c CMDS][--version]'

parser=OptionParser(usage=usage,version='Hu 2.0_20150609')
parser.add_option('-s','--Server',dest='server',default='ip.txt',help='The Server Info')
parser.add_option('-c','--CMDS',dest='cmd',default='pwd',help='You wann to execute commands')
(options,args)=parser.parse_args()
print options.server,options.cmd

logger=logging.getLogger()
logger.setLevel(logging.DEBUG)

ch=logging.StreamHandler()
cc=logging.handlers.RotatingFileHandler('log.txt', maxBytes = 1024*1024, backupCount = 5)

formatter=logging.Formatter("%(asctime)s-%(name)s-%(levelname)s %(message)s")
ch.setFormatter(formatter)
cc.setFormatter(formatter)

logger.addHandler(ch)
logger.addHandler(cc)

#ssh functions
def connect(ip,username,password,port,prompt=']#'):
try:
ssh_newkey='Are you sure you want to continue connecting'
child=pexpect.spawn('ssh '+username + '@'+ip+' -p '+port,maxread=5000)
child.logfile=fout
i=child.expect([prompt,'assword:*',ssh_newkey,'refused',pexpect.TIMEOUT,'key.*? failed'])
print i
#if not False:
# print child.before,child.after
if i==0:
pass
elif i==1:
print password
child.sendline(password)
elif i==2:
child.sendline('yes')
elif i==4:
raise Exception('Error TIMEOUT!')
elif i==3:
print 'Connect refused'
elif i==5:
print child.before,child.after
os.remove(os.path.expanduser('~')+'/.ssh/known_hosts')

child.expect('#')
print child.after,child.before

child.sendline(options.cmd)
child.expect('#')
print child.before,child.after
print 'The command %s result is:' % options.cmd
print  child.before
except Exception,e:
logger.error("Connect Error")

#check -s isn't exits
if os.path.exists(options.server):
filename=options.server
pass
else:
print 'Please check %s and ip.txt is exits' % options.server
exit(-1)

#execute
fout=file('mylog.txt','w')

for line in open(filename):
ip,user,passwd,port=line.strip().split()
print '*'*50
print 'The follow ip is %s:' % ip
p=multiprocessing.Pool(processes=4)
result=p.apply_async(connect,[ip,user,passwd,port])
print result.get()
#connect(ip,user,passwd,port)


E-mail:362299908@qq.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: