在现代网络环境中,了解网络设备的在线状态和端口开放情况对于网络管理和安全性至关重要。本文介绍了一款基于Python的自动化网络扫描和端口检测工具,该工具不仅能检测局域网内各设备的在线状态,还能尝试连接常见端口和自定义端口,并获取HTTP请求结果。以下是该工具的详细介绍和使用方法。

工具功能概述

该工具具备以下功能:

1. **扫描指定网段内的所有IP地址**:默认扫描192.168.1.x网段,用户可通过传入参数指定其他网段。
2. **检测常见端口和自定义端口的开放状态**:预定义了一组常见端口,并允许用户自定义一组端口范围进行检测。
3. **获取HTTP请求结果**:对于开放的HTTP/HTTPS端口,尝试发送请求并记录响应状态和内容。
4. **结果存储**:将检测结果存储在当前目录中的`http_results`文件夹中,方便用户后续查看。

代码实现

以下是工具的完整代码实现:

import os
import sys
import socket
import platform
import requests
import shutil

# 定义默认网段
DEFAULT_NET_SEGMENT = '192.168.1'

# 检查是否传入了网段参数,如果没有则使用默认网段
NET_SEGMENT = DEFAULT_NET_SEGMENT if len(sys.argv) <= 1 else sys.argv[1]

# 定义常见端口列表和自定义端口范围
COMMON_PORTS = [21, 22, 23, 25, 53, 80, 110, 143, 443, 3000, 3306, 5000, 8888]
CUSTOM_PORTS = range(5173, 5180)  # 自定义端口范围

# 合并常见端口和自定义端口范围
PORTS_TO_CHECK = list(COMMON_PORTS) + list(CUSTOM_PORTS)

# 定义输出文件路径
HTTP_RESULTS_DIR = os.path.join(os.getcwd(), 'http_results')

# 清空HTTP请求结果文件夹
if os.path.exists(HTTP_RESULTS_DIR):
    shutil.rmtree(HTTP_RESULTS_DIR)
os.makedirs(HTTP_RESULTS_DIR)

def check_port(ip, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(1)  # 设置超时时间
    try:
        sock.connect((ip, port))
        sock.close()
        return True
    except socket.error:
        return False

def check_http(ip, port):
    protocols = ['http', 'https']
    for protocol in protocols:
        try:
            url = f'{protocol}://{ip}:{port}'
            response = requests.get(url, timeout=2)  # 设置超时时间
            # 尝试使用响应的编码解码文本
            response.encoding = response.apparent_encoding
            return protocol, response.status_code, response.text
        except requests.RequestException:
            continue
    return None, None, None

# 获取当前操作系统
current_os = platform.system().lower()

# 定义ping命令参数
if current_os == 'windows':
    ping_cmd = 'ping -n 1 -w 100'
else:
    ping_cmd = 'ping -c 1 -W 1'

# 循环ping网段内的每个IP地址
for i in range(1, 255):
    IP = f'{NET_SEGMENT}.{i}'
    response = os.system(f'{ping_cmd} {IP}')
    if response == 0:
        online = False
        port_results = []
        for port in PORTS_TO_CHECK:
            if check_port(IP, port):
                online = True
                protocol, http_status, http_response = check_http(IP, port)
                if http_status is not None:
                    port_results.append(
                        f'{protocol.upper()} 端口{port} HTTP {http_status}\n请求结果:\n{http_response}\n')

        if online and port_results:
            # 将端口检测结果写入文件
            try:
                with open(os.path.join(HTTP_RESULTS_DIR, f'{IP.replace(".", "_")}_port_results.txt'), 'w', encoding='utf-8') as port_file:
                    port_file.write(f'{IP} 端口检测结果:\n')
                    port_file.write('\n'.join(port_results) + '\n')
            except UnicodeEncodeError as e:
                print(f"写入文件时遇到编码错误: {e}")

# 提示用户查看结果并退出程序
print('已完成,结果已保存到', HTTP_RESULTS_DIR)

环境准备

在运行脚本之前,请确保已安装Python环境并安装必要的Python库。以下是详细的安装步骤:

1. **安装Python**:
   - 请访问[Python官方网站](https://www.python.org/)下载并安装最新版本的Python。

2. **安装必要的Python库**:
   - 打开命令行或终端。
   - 运行以下命令安装`requests`库:

pip install requests

使用说明

1. **运行脚本**:
   - 打开命令行或终端。
   - 运行脚本:`python script.py [网段]`,例如`python script.py 192.168.0`。如果不指定网段,默认扫描192.168.1.x网段。

2. **查看结果**:
   - 脚本执行完成后,会在当前目录中的`http_results`文件夹内生成包含各IP端口检测结果的文件。
   - 打开对应文件查看HTTP请求响应内容和端口开放情况。

这款自动化网络扫描和端口检测工具,用户可以方便地监控局域网内设备的在线状态和端口开放情况,为网络管理和安全维护提供了极大的便利。工具适用于不同操作系统,使用简单,结果清晰明了,是网络管理员和安全人员的得力助手。

点赞(0)

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部