📜  如何在 python 中创建网络扫描仪(1)

📅  最后修改于: 2023-12-03 15:38:23.645000             🧑  作者: Mango

如何在 Python 中创建网络扫描器

在网络中,扫描器是一种非常常见的工具,它可以用来扫描网络中的设备和服务,并将结果统计到一份报告中。Python 是一门非常强大的语言,有很多第三方库可以用来开发网络扫描器,接下来就让我们来看看如何用 Python 创建一个简单的网络扫描器。

步骤一:安装必要的库

在 Python 中开发网络扫描器,我们需要使用以下几个库:

  1. socket :Python 中用来进行网络编程的库,可以用来连接网络中的设备和服务。

  2. argparse :Python 中用来处理命令行参数的库,可以用来设置网络扫描器的参数和选项。

  3. ipaddress :Python 中用来处理 IP 地址的库,可以用来验证和解析 IP 地址。

你可以使用以下命令来安装这三个库:

pip install socket argparse ipaddress
步骤二:解析命令行参数

使用 argparse 库来解析命令行参数,可以让我们的网络扫描器更加灵活和易于使用。下面是一个简单的示例:

import argparse

parser = argparse.ArgumentParser(description='Simple port scanner.')
parser.add_argument('host', metavar='host', type=str, help='The host you want to scan.')
parser.add_argument('-p', '--ports', dest='ports', type=str, help='The ports you want to scan.')

args = parser.parse_args()

if not args.ports:
    args.ports = '1-65535'

在这个示例中,我们定义了一个命令行参数 host,用来指定要扫描的主机;还定义了一个可选参数 ports,用来指定要扫描的端口。如果没有指定端口范围,则默认扫描 1-65535 端口。

步骤三:开始扫描

经过上面两步的准备,我们已经可以开始编写网络扫描器的核心代码了。下面是一个简单的示例:

import socket
import argparse
import ipaddress
import concurrent.futures

def scan_port(port, ip_address):
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(1)
        sock.connect((str(ip_address), port))
        print(f"Port {port} is open")
        sock.close()
    except:
        pass

def main():
    parser = argparse.ArgumentParser(description='Simple port scanner.')
    parser.add_argument('host', metavar='host', type=str, help='The host you want to scan.')
    parser.add_argument('-p', '--ports', dest='ports', type=str, help='The ports you want to scan.')
    args = parser.parse_args()

    ip_address = ipaddress.ip_address(args.host)
    ports = args.ports.split("-")

    if len(ports) == 1:
        ports.append(ports[0])

    start_port = int(ports[0])
    end_port = int(ports[1])

    with concurrent.futures.ThreadPoolExecutor(max_workers=100) as executor:
        for port in range(start_port, end_port + 1):
            executor.submit(scan_port, port, ip_address)

在这个示例中,我们定义了一个函数 scan_port(),用来扫描指定主机上的一个端口。在 main() 函数中,我们使用了 Python 中的 ThreadPoolExecutor 来创建了一个最大并发线程数量为 100 的线程池,然后遍历了指定范围内的所有端口,将每一个端口的扫描任务提交给线程池中的一个线程。

我们可以使用以下命令来运行这个网络扫描器:

python scanner.py 127.0.0.1 -p 1-1024

这个命令会扫描本机上的 127.0.0.1 主机的 1-1024 端口,然后将扫描结果输出到屏幕上。

以上就是一个简单的网络扫描器的实现示例,当然,实际的网络扫描器需要更加严谨和复杂的检测逻辑和算法,才能在实际场景中发挥更好的作用。