2

为了检查多个服务器上是否存在某个文件,我创建了一个线程类,用于paramiko使用 ssh 执行远程命令。每个线程的结果都被插入到一个线程安全中,我在所有的s 完成Queue.Queue后读取它的内容。join()这是线程的主要部分:

client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect(self.server, username='linqmap', timeout=5)
stdin, stdout, stderr = client.exec_command('my_command')

这个解决方案效果很好,但是有一个奇怪的行为引起了我的注意。线程记录它的__init__时间:

def __init__(self, server, queue, lock):
    ...
    self.start_time=datetime.datetime.now()
    ...

及其完成时间(结果插入队列的时间):

def _report(self, message, status):
    duration=datetime.datetime.now()-self.start_time
    ...
    self.queue.put( (self.server, duration, message, status) )

问题是所有线程的持续时间都非常相似。对于少量 (~5) 线程,大约需要 3 秒。对于较大的数字(~100),大约是 30 秒。

由于连接超时 5 秒,我假设所有线程要么在 5 秒内完成,要么失败。知道这里发生了什么吗?

4

1 回答 1

3

timeout只是针对 TCP 连接,而不是连接上的整个操作。

我希望__init__在原始线程上调用 - 只有该run()方法在新线程上运行。所以你的时间可能是无效的。

SSH 涉及到一定数量的隧道加密和设置处理,因此可能值得查看客户端上的 CPU 使用情况,看看这是否是 100 个连接的限制因素。

于 2011-07-26T12:43:44.590 回答