亿万教师注册平台python paramiko多线程遇到的题目

近来在学习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 = openself.pass_file
        for line in HostList.readlines:
            ARAY_line = string.splitline
            self.host = ARAY_line[0]
            self.port = intARAY_line[1]
            self.t = threading.Threadtarget = self.Connect,args = self.host,self.port,self.username,self.passwd
            self.threads.appendself.t
        for i in range10:
            self.threads[i].start
        for i in range10:
            self.threads[i].join
    def Connectself,host,port,username,passwd:
        # This function is to connect the agent
        self.ssh.set_missing_host_key_policyparamiko.AutoAddPolicy
        #ssh.load_system_host_keys  
        paramiko.util.log_to_fileself.paramiko_log
        try:
            self.ssh.connecthost,port,username,passwd
        except Exception as e:
            print \033[31m + self.host,stre  + \033[0m
        else:
            self.Cmd
            self.ssh.close
    
    def Cmdself:
        stdin,stdout,stderr = self.ssh.exec_commandself.cmd
                self.sout = stdout.readlines
        print \033[32m + self.host,strself.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,求指教。

题目出在下面这句:

self.t = threading.Threadtarget = self.Connect,args = self.host,self.port,self.username,self.passwd

Thread构造函数不会对args参数中断deep copy,并且在start的时分才会真正运用。
但是你的次序在start时self.host和self.port曾经在循环最后被赋值为最后一个host和port,
以是一旦线程都启动后,拜访的便是最后一个host。
处理办法是不要共享一个变量,如下是一种改法:

for line in HostList.readlines:
    ARAY_line = string.splitline
    host = ARAY_line[0]
    port = intARAY_line[1]
    self.t = threading.Threadtarget = self.Connect,args = host,port,self.username,self.passwd
    self.threads.appendself.t

其他中央也可以随着修正。

(看完/读完)这篇文章有何感想! 亿万先生注册平台的分享…

发表评论

姓名 *
电子邮件 *
站点