我有一个程序会收到一个包含路由器IP地址的列表。对于其中的每一个,将通过SSH隧道触发telnet连接。
这很好用。除了如果列表大于1000个地址(即1250)之外,将仅考虑前1000个元素。前1000个没问题,但剩下的250个甚至都不会被考虑。
首先,伪代码:
并行连接数是一个固定的整数(10,20,30等)。我用40个并行连接测试了代码。
这是代码本身。
import ipaddress as ip
import threading
from multiprocessing.pool import ThreadPool,Pool
import paramiko
from sshtunnel import SSHTunnelForwarder
class connTelnet(threading.Thread):
def __init__(self,thrdNum, script, loopback):
threading.Thread.__init__(self)
self.num = thrdNum
self.script = script
self.loopback = loopback
self.strConn = "Con-" + str(self.num) + "| "
def run(self):
self.s = self.sshStart(self.strConn,self.loopback)
self.sshStatus = self.s[0]
self.sshServer = self.s[1]
self.localPort = self.s[2]
if self.sshStatus == 1:
print(self.strConn + ": Quitting....")
self.sshStop(self.sshServer,self.strConn,self.num)
def sshStart(self,strConn,loopback):
try:
sshServer = SSHTunnelForwarder(
(IP, PORT),
ssh_username = USER,
ssh_password = PASSWORD,
remote_bind_address = (loopback, 23),
)
sshServer.start()
localPort = sshServer.local_bind_port
sshStatus = 1
print(strConn + "SSH Tunnel Up: " + loopback + ":" + str(localPort))
except:
print(strConn + "Error SSH Tunnel")
sshStatus = -1
sshServer = -1
localPort = -1
return(sshStatus,sshServer,localPort)
def sshStop(self,sshServer,strConn,num):
sshServer.stop()
print(strConn + "SSH" + str(num) + " stopped ...")
def run_mi_thread(i, script, loopback):
connTelnet(i, script, loopback).run()
#### Main ####
if __name__ == '__main__':
progNumThreads = 40
n = 1010
a = '99.0.0.0'
ipaddress = ip.IPv4Address(a)
routers = [(ipaddress+x).exploded for x in range(1,n)]
threads_list = Pool(progNumThreads)
for i, router in enumerate(routers):
# We generate the config file
script = "blablabla\n"
threads_list.apply_async(run_mi_thread, args=(i, script, router))
threads_list.close()
threads_list.join()
因此,如前所述,如果len(threads_list) <= 1000
,将提供所有路由器。如果len(threads_list) > 1000
,则只会提供前1000个路由器。
更多结果:很奇怪这个数字是1000.它总是一样的。不会随着程序的多次运行而改变。
它是否与一些并行套接字的数量有关? SSH隧道的数量?
谢谢!