📅  最后修改于: 2023-12-03 15:38:23.645000             🧑  作者: Mango
在网络中,扫描器是一种非常常见的工具,它可以用来扫描网络中的设备和服务,并将结果统计到一份报告中。Python 是一门非常强大的语言,有很多第三方库可以用来开发网络扫描器,接下来就让我们来看看如何用 Python 创建一个简单的网络扫描器。
在 Python 中开发网络扫描器,我们需要使用以下几个库:
socket
:Python 中用来进行网络编程的库,可以用来连接网络中的设备和服务。
argparse
:Python 中用来处理命令行参数的库,可以用来设置网络扫描器的参数和选项。
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
端口,然后将扫描结果输出到屏幕上。
以上就是一个简单的网络扫描器的实现示例,当然,实际的网络扫描器需要更加严谨和复杂的检测逻辑和算法,才能在实际场景中发挥更好的作用。