У меня есть программа, которая получит список, содержащий IP-адреса маршрутизаторов.Для каждого из них подключение по Telnet будет запускаться через SSH-туннель.
Это хорошо работает.За исключением того факта, что если список больше 1000 адресов (т.е. 1250), будут учитываться только первые 1000 элементов.Первая 1000 будет в порядке, но остальные 250 даже не будут учитываться.
Итак, во-первых, псевдокод:
- открыть ssh-соединение с сервером и вызвать sshтуннель.вернуть локальный порт
- открыть соединение telnet с удаленным маршрутизатором, используя локальный порт
- сделать что-то
- закрыть telnet
- закрыть ssh
Число параллельных соединений является фиксированным целым числом (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-туннелей?
Спасибо!