python多線程掃描端口

常用的端口掃描工具:netcat

nc -z -v -n IP 10-65535

如果簡單的一臺機器,幾個端口沒問題,很多臺機器就麻煩了。

下面是一個多線程掃描的python小程序:使用telnet,默認掃TCP端口

#!/usr/bin/env python

import telnetlib
import threading
import queue
import logging

loggers = {}

server = telnetlib.Telnet()


def get_ip_status(a_ip, a_port):
    try:
        server.open(a_ip, a_port)
        loggers[a_ip + '_open'].warning('{0} port {1} is open'.format(a_ip, a_port))
    except Exception as err:
        # print('{0} port {1} is not open'.format(a_ip, a_port))
        loggers[a_ip + '_close'].error('{0} port {1} is not open'.format(a_ip, a_port))
    finally:
        server.close()


def check_open(a_q):
    try:
        while True:
            the_ip, the_port = a_q.get_nowait()
            get_ip_status(the_ip, the_port)
    except queue.Empty as e:
        print(e)


def init_logger(host_arr):
    logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    for h in host_arr:
        loggers[h + '_open'] = get_logger(h + '_open.log')
        loggers[h + '_close'] = get_logger(h + '_close.log')


def get_logger(name):
    handler = logging.FileHandler(filename=name)
    logger = logging.getLogger('port_scan_' + name)
    logger.addHandler(handler)
    return logger


if __name__ == '__main__':
    host = ['10.10.10.1', '10.10.10.2', '10.10.10.3', '10.10.10.4']
    init_logger(host)
    q = queue.Queue()
	[q.put((ip, port)) for ip in host for port in range(1, 65535)]
    
    threads = []
    n_thread = 100
    for i in range(n_thread):
        t = threading.Thread(target=check_open, args=(q,))
        t.start()
        threads.append(t)

    for t in threads:
        t.join()

線程數開100個,還是很快的,視端口數量而定,本機測試5個IP*6萬多個端口,大概需要1個小時才能跑完。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章