python ssh 客户端 多线程 不指定

kangyang , 2014/08/06 14:26 , Python , 评论(0) , 阅读(3668) , Via 本站原创 | |
#!/usr/bin/python2.6
import os
import time
import paramiko
import ConfigParser
import threading
import Queue
import optparse

class thread_ssh(threading.Thread):
    def __init__(self,work_queue):
        super(thread_ssh,self).__init__()
        self.work_queue = work_queue
    def run(self):
        while True:
            try:
                machine = self.work_queue.get()
                self.process(machine)
            finally:
                self.work_queue.task_done()

    def process(self,machine):
        hostname=str(machine[1]).strip()
        port=int(machine[2])
        username=str(machine[3]).strip()
        password=str(machine[4]).strip()
        cmd=';'.join( machine[5:])
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.load_system_host_keys()
        #ssh.load_host_keys('/root/.ssh/known_hosts')
        ssh.connect(hostname,port,username,password)
        (stdin,stdout,stderr)=ssh.exec_command(cmd)
        output=stdout.read()
        pid=os.getpid()
        print "The %s run in  %s"  %(self.name,hostname)
        print output
        info.write('n=======================n====>>'+hostname+'n=======================nn')
        info.write(output)
        info.flush()
        ssh.close()

def read_cfg_file(file):
    machines = []
    config = ConfigParser.ConfigParser()
    config.read(file)
    host_items = config.items("HOST")
    cmd_items = config.items("CMD")
    for item in host_items:
         host=item[1].split()
         for cmd_item in cmd_items:
             host.append(cmd_item[1])
         machines.append(host)
    return machines

def parse_options():
     description = "A ssh client with thread."
     usage="usage: %prog [options]n       Please use --helpnnAuthor: mrmuxl@sina.com"
     version = "Version: %prog 0.1 nAuthor: mrmuxl@sina.com"
     parser = optparse.OptionParser(description = (description),usage = (usage),version=(version))
     parser.add_option("-c","--config",action="store",type="string",dest="config",default="pssh.cfg",help="program's config file")
     parser.add_option("-o","--outpufile",action="store",type="string",dest="outputfile",default="outputfile.log",help="program's output file")
     parser.add_option("-l","--logfile",action="store",type="string",dest="logfile",default="ssh.log",help="ssh client running log")
     opts,args=parser.parse_args()
     return opts,args

if __name__ == '__main__':

    start_cpu = time.clock()
    start_real = time.time()

    opts,args = parse_options()
    paramiko.util.log_to_file(opts.logfile)
    info=open(opts.outputfile,'a')
    hosts=read_cfg_file(opts.config)


    work_queue = Queue.Queue()

    for i in range(9):
        pssh =thread_ssh(work_queue)
        pssh.daemon=True
        pssh.start()

    for machine in hosts:
        if machine[0] == 'On' or machine[0] == 'on' or machine[0] == 'ON':
            work_queue.put(machine)
    work_queue.join()

    info.close()
    end_cpu = time.clock()
    end_real = time.time()

    print("%f Real Seconds" % (end_real - start_real))
    print("%f CPU Seconds" % (end_cpu - start_cpu))
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]