python paramiko并发_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 = 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,求指教。

解决方案

问题出在下面这句:

self.t = threading.Thread(target = 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.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)

其他地方也可以跟着修改。

扫一扫关注IT屋

微信公众号搜索 “ IT屋 ” ,选择关注与百万开发者在一起

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值