Python线程的SSH端口扫描器在执行过程中停止工作

2024-04-27 04:04:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用Python为SSH制作端口扫描程序。我正在使用threading模块来加快速度。然而,我遇到了一个问题,它停止扫描IP,并且扫描它们的速度非常慢,就像没有多线程一样。在某个时刻,我等了2分钟,我的电脑开始落后。然后,20秒后,程序完成了扫描,但我很确定从那时起我改变了一些重要的事情。当它完成时,我还观察到,使用SSH的IP列表的长度等于线程数(15000),这对于变量来说不是问题,因为每次程序成功连接到一个带有22端口的IP时,它都会将该IP附加到一个列表中,然后我从中获得长度,这个IP范围应该有很多SSH IP(有人得到了45000个),所以它可能在某种程度上限制了数量

print_lock = threading.Lock()

ip_list = []

SSH_ips = []

time_start = datetime.now()

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

def scan(ip_number):
    ip_try = ip_list[ip_number]
    c = ip_try.split(".")
    percentage = (ip_number / len(ip_list)) * 100
    d = "Scanning " + c[0] + "." + c[1] + "." + c[2] + (".* [IPs found: %d] [%d%% done]" % (len(SSH_ips), percentage))
    print(d, end="\r")
    try:
        conn = sock.connect_ex((ip_try,22))
        if conn == 0:
            with print_lock:
                SSH_ips.append(ip_try)

        else:
            pass

    except:
        pass

def gulag():
    while True:
        worker = q.get()
        scan(worker)
        q.task_done()

q = Queue()

t = threading.Thread(target=gulag)
t.daemon = True

for x in range(int(sys.argv[2])):
    t = threading.Thread(target=gulag)
    t.daemon = True
    t.start()

for worker in range(0, 65026):
    q.put(worker)

q.join()

time_finish = datetime.now()

time_elapsed = time_finish - time_start

ip_list_length = len(SSH_ips)

SSH_ips.sort()

SSH_ips = list(set(SSH_ips))

print("Found %s IPs in %s." % (ip_list_length, time_elapsed));

print(SSH_ips)

Tags: 程序ipnumberlentimesocketstartssh