如何:线程将子网拆分为子列表,并为每个lis生成一个线程

2024-06-16 10:46:33 发布

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

我已经创建了一个网络扫描仪,它在一系列的IP上寻找一个特定的端口。我想线程的应用程序,但我得到和错误消息

ERROR:
for worker in range(network.hosts):
TypeError: 'method' object cannot be interpreted as an integer

现在我明白了为什么会出现错误,因为IP地址不是整数。但是,我更喜欢将子网分成相等的部分,并在每个线程的基础上运行X个IP。在

示例

^{pr2}$

沿着这些路线。我不太清楚该怎么做。我发布的主要功能,tcp ping 以及线程功能。在

我怀疑我需要得到一个IP的列表,然后告诉线程一次在X个IP上执行,但并不确定如何执行。在

提前谢谢你的帮助

好像你不能在名单上启动一个工人?这里是我当前关于错误消息的位置。其他线程似乎有相同的错误消息。这是jsut输出的最后几行。在

^{3}$

代码:

 # Library Imports
from datetime import datetime
from queue import Queue
import threading
import argparse
import logging
import os
import socket
import ipaddress


# Defines Global Variables
BUFFER = 4096  # 4k The size of the TCP Buffer
MESSAGE = 'TA:getattrlong'.encode('utf-8')
TCP_PORT = 2359  # Sets Port to 2359 (iPerf Remote)
MIN_SCAN_TIMEOUT = .010  # Sets Min socket timeout to 10ms 'milliseconds'
MAX_SCAN_TIMEOUT = .160  # Sets Max socket timeout to 100ms 'milliseconds'
IPERF_QUERY_TIMEOUT = 5  # Sets socket timeout to 5s 'seconds'

# File I/O Vars
LOG_FILE = 'iperfdiscovery.log'  # Testing log, revert to above on actual AirCheck G2
IPERF_ACCESSORY_FILE = 'iperfaccessory'  # iPerf Accessory output file
OPTION_FILE = '/mnt/mmc3/iperfaccessory.conf'  # iPerf Accessory option file "Allows increasing timeout"

THREADS = 50


def main():
    """
    iPerf Accessory Discovery Utility for AirCheck G2 V2.0

    :return:
    """
    # Logging (File Location, Log level, date, message)
    logging.basicConfig(filename=LOG_FILE, filemode='w', level=logging.DEBUG, format='%(asctime)s %(message)s')

    # Removes iPerf Accessory File if its exists File Output Logs errors
    # NOTE: File cannot be found is normal in the log expected behavior
    try:
        os.remove(IPERF_ACCESSORY_FILE)
    except OSError as err_msg:
        logging.debug('DEBUG: OS Error %s', err_msg)
        pass

    # Arg Parser
    parser = argparse.ArgumentParser()
    parser.add_argument('network', help='The IP/Network you wish to scan', type=str)
    parser.add_argument('-t', '--timeout', nargs='?', const=1, type=float, help='Optional socket timeout')
    parser.add_argument('-v', '--version', action='version', version='%(prog)s 1.9')
    parser.add_argument('-o', '--options', action='store_true',
                        help='Uses the advanced configuration options if present')
    parser.add_argument('-th', '--threading', action='store_true',
                        help="Enables multiple threads")

    try:
        args = parser.parse_args()
        network = args.network  # Gets network from args parse mandatory argument
        network = (ipaddress.ip_network(network, strict=False))

        if args.options:
            OPTION_FILE()

        if args.timeout:
            MIN_SCAN_TIMEOUT = args.timeout
            print(MIN_SCAN_TIMEOUT)
        if args.threading:
            q = Queue
            iperf = []
            subnet = []

            for host in network.hosts():  # List of IP's in subnet
                subnet.append(str(host))

            for i in range(0, len(subnet), THREADS):
                iperf.append(subnet[i: i + THREADS])

            for x in range(THREADS):
                t = threading.Thread(target=threader, args=q)
                t.daemon = True
                t.start()

            for worker in range(iperf[0:]):
                q.put(worker)

            q.join()

        else:
            tcp_port_ping(network)

    except KeyboardInterrupt as err_msg:
        logging.debug(err_msg)

    except OSError as err_msg:
        logging.debug(err_msg)


def threader(q):
    while True:
        worker = q.get()
        t_tcp_port_ping(worker)
        q.task_done()


def t_tcp_port_ping():

    active_ip_count = 0
    tmp_iperf_list = []

    try:
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as tcp_sock:
            result = tcp_sock.connect_ex((str(host), TCP_PORT))  # Check if IP is Valid and Port is Open
            if result == 0:
                active_ip_count += 1  # Increment valid IP counter
                tmp_iperf_list.append(host)  # Appends iPerf attributes to iPerf Remote list
                logging.debug("DEBUG: IP(s) to be scanned %s", host)  # Debug IP Address of remote(s)

    except OSError as err_msg:
        logging.debug('Socket Error %s', err_msg)
        print(err_msg)
        pass

    print(tmp_iperf_list)

Tags: toinimportipparserforiflogging