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

最近在学习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,求指教。

迷茫
迷茫

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

모든 응답(1)
Peter_Zhu

문제는 다음 문장에 있습니다.

으아악

Thread 생성자는 args 매개변수의 전체 복사를 수행하지 않으며 시작할 때만 사용됩니다.
그러나 프로그램이 시작되면 self.host 및 self.port가 루프 끝의 마지막 호스트와 포트에 할당됩니다.
따라서 스레드가 시작되면 마지막 호스트에 액세스됩니다.
해결 방법은 변수를 공유하지 않는 것입니다. 수정 사항은 다음과 같습니다.

으아악

다른 장소도 이에 따라 수정될 수 있습니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿