python paramiko多线程遇到的问题
迷茫
迷茫 2017-04-18 10:00:09
0
1
615

最近在学习python,用python写了个检查ssh存活的脚本。写完后想增加多线程功能,加快效率,可是一直报错,麻烦大神帮我看下到底错在哪了

以下是代码:

#!/usr/bin/python
import os
import string
import paramiko
import traceback
import threading

class SshServerCMD():
    def __init__(self):
        print 'start'
        self.username = 'root'
        self.passwd = '123'
        self.cmd = 'date +%s'
        self.ssh = paramiko.SSHClient()
        self.pass_file = '/opt/scripts/etc/ssh_proxy.conf'
        self.paramiko_log= '/tmp/check_ssh_proxy.log'
        self.threads = []
        HostList = open(self.pass_file)
        for line in HostList.readlines():
            ARAY_line = string.split(line)
            self.host = ARAY_line[0]
            self.port = int(ARAY_line[1])
            self.t = threading.Thread(target = self.Connect,args = (self.host,self.port,self.username,self.passwd))
            self.threads.append(self.t)
        for i in range(10):
            self.threads[i].start()
        for i in range(10):
            self.threads[i].join()
    def Connect(self,host,port,username,passwd):
        # This function is to connect the agent
        self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        #ssh.load_system_host_keys()  
        paramiko.util.log_to_file(self.paramiko_log)
        try:
            self.ssh.connect(host,port,username,passwd)
        except Exception as e:
            print '\033[31m' + self.host,str(e)  + '\033[0m'
        else:
            self.Cmd()
            self.ssh.close()
    
    def Cmd(self):
        stdin,stdout,stderr = self.ssh.exec_command(self.cmd)
                self.sout = stdout.readlines()
        print '\033[32m' + self.host,str(self.sout) + '\033[0m'

if __name__ == '__main__':
    SshServerCMD()

以下是/opt/scripts/etc/ssh_proxy.conf文件内容

192.168.1.2 4001
192.168.1.3 4002
192.168.1.4 4003
192.168.1.5 4004
192.168.1.6 4005
192.168.1.7 4006
192.168.1.8 4007
192.168.1.9 4008
192.168.1.10 4009
192.168.1.11 4010

报错:
执行脚本后,发现程序不停在尝试ssh 192.168.1.11,也就是文本中所写的最后一行的ip地址,并且全部都是连接失败。在逻辑上我就想不通,就算是连接失败,也应该从第一行ip开始尝试,为什么会从最后一行ip开始ssh呢?并且一直在尝试ssh最后一行ip,求指教。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

répondre à tous(1)
Peter_Zhu

Le problème réside dans la phrase suivante :

self.t = threading.Thread(target = self.Connect,args = (self.host,self.port,self.username,self.passwd))

Le constructeur Thread n'effectuera pas de copie complète des paramètres args, et ne sera utilisé qu'au démarrage.
Mais lorsque votre programme démarre, self.host et self.port ont été attribués au dernier hôte et port à la fin de la boucle
Ainsi, une fois les threads démarrés, le dernier hôte est accédé.
La solution est de ne pas partager de variable. Voici une modification :

for line in HostList.readlines():
    ARAY_line = string.split(line)
    host = ARAY_line[0]
    port = int(ARAY_line[1])
    self.t = threading.Thread(target = self.Connect,args = (host,port,self.username,self.passwd))
    self.threads.append(self.t)

D'autres lieux peuvent également être modifiés en conséquence.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal