为了检查许多服务器上是否存在某个文件,我创建了一个使用paramiko
来使用ssh执行远程命令的线程类。将每个线程的结果插入到线程安全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秒内完成或失败。知道这里发生了什么吗?
答案 0 :(得分:3)
timeout
仅用于TCP连接,而不是连接上的整个操作。
我希望在原始线程上调用__init__
- 只有run()
方法在新线程上运行。所以你的时间可能无效。
SSH涉及隧道加密和设置的一定数量的处理,因此可能值得查看客户端上的CPU使用情况,看看这是否是100个连接的限制因素。