Python多线程探测SSH主机(示例)

发布时间:2019-12-28编辑:脚本学堂
分享一个python实现的探测ssh主机存活状态的代码,学习下python多线程的应用实例,有需要的朋友参考下。

问题描述:
要在做线上操作之前,尝试判断主机是否都是可以连接。
由于一次遍历所涉及到的主机数量比较多,所以采用多线程方式来实现!

1,python多线程探测ssh主机的代码:
 

复制代码 代码示例:

import Queue, threading
import paramiko
class Worker(threading.Thread):
    failhostlist = [] #表示失败的主机列表
    def run(self):
        while 1:
            if self.q.qsize() == 0:break
            host, sudo_user, sudo_pass = self.q.get()  #从队列里面拿数据
            self.pssh_action(host, sudo_user, sudo_pass)  #干活的内容
            self.q.task_done()    #表示任务已完成了向队列发一个信号                    
            return                #干完活了就可以终止掉线程了return  退出

    def pssh_action(self,host,sudo_user,sudo_pass):
        s=paramiko.SSHClient()
        s.load_system_host_keys()
        try:
            s.connect(hostname=host,username=sudo_user,password=sudo_pass,timeout=3)
            s.close()
        except Exception,e:
            self.failhostlist.append(host)
            return
 

2,调用示例:
 

复制代码 代码示例:
thread_pool = []
queue = Queue.Queue(0)  #队列长度无限长
for host in A:
        queue.put([host, 'username', 'password'])  #将任务放到队列里面
for i in range(4):
        worker = Worker()
        worker.q = queue           #Python中的动态修改类的属性。这就是动态语言的魅力!
        worker.start()
        thread_pool.append(worker)  #将当前这个子线程添加到线程池里面去!
for i in range(4):
        thread_pool[i].join()       #线程池里面的子线程之间join(表示堵塞直到全部都干完活了)
print worker.failhostlist