From ac1fc4421a97a51f4a0716688e78617c4db4a4ed Mon Sep 17 00:00:00 2001 From: Ching L Date: Wed, 7 Jan 2026 18:14:42 +0800 Subject: [PATCH] feat(sso): add network scanning and device identification tools - Add scan_burn.sh: fast parallel SSH port scanner for subnet 172.24.11.129-254 - Add scan_burn.py: device identification tool with MAC address mapping - Update README.md with comprehensive documentation for new tools - Add usage examples, configuration guide, and troubleshooting section - Support multi-threaded concurrent scanning with configurable parameters --- sso/README.md | 98 +++++++++++++++++++++++++++++++++++-- sso/scan_burn.py | 123 +++++++++++++++++++++++++++++++++++++++++++++++ sso/scan_burn.sh | 57 ++++++++++++++++++++++ 3 files changed, 273 insertions(+), 5 deletions(-) create mode 100644 sso/scan_burn.py create mode 100755 sso/scan_burn.sh diff --git a/sso/README.md b/sso/README.md index a1a1654..b91db07 100644 --- a/sso/README.md +++ b/sso/README.md @@ -6,6 +6,8 @@ - `run_sso_script.sh` - 主要执行脚本,负责将 Python 脚本上传到远程服务器并执行 - `sso_script.py` - Django 交互式管理脚本,提供 SSO 系统的各种管理功能 +- `scan_burn.sh` - 网络扫描工具,快速扫描指定子网段中开启 SSH 服务的设备 +- `scan_burn.py` - 设备识别工具,扫描网络并通过 MAC 地址识别设备编号 ## 功能概述 @@ -30,6 +32,18 @@ - 更新已绑定序列号的商品信息 - 支持批量修改商品绑定关系 +### scan_burn.sh 功能 +- 快速扫描指定子网段(172.24.11.129-254)中开启 SSH 服务的设备 +- 使用多线程并行扫描,提高扫描效率 +- 显示扫描耗时和发现的 SSH 服务器列表 + +### scan_burn.py 功能 +- 扫描网络中开启 SSH 服务的设备 +- 通过 SSH 连接获取设备的 MAC 地址 +- 根据 MAC 地址识别设备编号 +- 支持自定义子网段、并发数、超时时间 +- 显示设备编号、IP 地址和 MAC 地址的对应关系 + ## 使用方法 ### 环境配置 @@ -45,7 +59,11 @@ - 确保可以通过 SSH 连接到远程服务器 - 远程服务器上存在包含 "celery" 名称的 Proxmox 容器 -### 执行步骤 +3. **网络扫描工具依赖**: + - `scan_burn.py` 需要 Python 3 和 paramiko 库:`pip install paramiko` + - `scan_burn.sh` 需要 bash 环境支持 + +### SSO 管理工具使用步骤 1. **运行主脚本**: ```bash @@ -71,6 +89,43 @@ - **功能2**:输入商品ID、批次ID、开始流水号、结束流水号 - **功能3**:输入新商品ID、批次ID、开始流水号、结束流水号 +### 网络扫描工具使用步骤 + +#### scan_burn.sh 使用 +1. **运行扫描脚本**: + ```bash + ./scan_burn.sh + ``` + +2. **查看结果**: + 脚本会自动扫描 172.24.11.129-254 网段并显示开启 SSH 的设备 + +#### scan_burn.py 使用 +1. **配置扫描参数**(在脚本中修改): + ```python + SUBNET = "172.24.11" # 修改为目标子网 + SSH_PORT = 22 # SSH 端口 + MAX_WORKERS = 10 # 并发线程数 + TIMEOUT = 0.5 # 连接超时时间 + ``` + +2. **配置设备 MAC 地址映射**(在脚本中修改): + ```python + machine_macs = { + "24:5d:fc:70:00:01": 1, + "24:5d:fc:70:00:00": 2, + # 添加更多 MAC 地址映射 + } + ``` + +3. **运行扫描脚本**: + ```bash + python3 scan_burn.py + ``` + +4. **查看结果**: + 脚本会显示设备编号、IP 地址和 MAC 地址的对应关系 + ### 使用示例 #### 示例1:创建 50 个 XDP Ultra Redeem Code @@ -97,24 +152,57 @@ 请输入结束流水号 (stop): 1100 ``` +#### 示例4:扫描网络设备 +```bash +# 使用 bash 版本快速扫描 +./scan_burn.sh + +# 使用 Python 版本获取详细信息 +python3 scan_burn.py +``` + ## 技术架构 - **远程执行**:使用 SSH 和 Proxmox 容器技术 - **Django 集成**:脚本运行在 Django 环境中,可访问相关数据模型 - **数据处理**:使用 MongoDB 和 FlexEngine 进行数据操作 - **许可证管理**:集成许可证颁发和管理系统 +- **网络扫描**:使用多线程并发扫描和 SSH 连接技术 +- **设备识别**:基于 MAC 地址的设备识别和映射 ## 注意事项 -1. **权限要求**:需要远程服务器的 root 权限 -2. **网络连接**:确保与远程服务器的网络连通性 -3. **数据安全**:操作涉及生产数据,请谨慎使用 +1. **权限要求**: + - SSO 管理工具需要远程服务器的 root 权限 + - 网络扫描工具需要目标设备的 SSH 访问权限 + +2. **网络连接**: + - 确保与远程服务器的网络连通性 + - 网络扫描工具需要在目标网络内执行 + +3. **数据安全**: + - 操作涉及生产数据,请谨慎使用 + - 网络扫描可能触发安全告警,请确保已获得授权 + 4. **错误处理**:脚本包含基本错误处理,如遇问题请检查输入参数 + 5. **清理机制**:脚本会自动清理远程临时文件,无需手动操作 +6. **性能优化**: + - 网络扫描工具使用多线程并发,可根据网络情况调整并发数 + - 扫描大量设备时建议适当增加超时时间 + ## 故障排除 +### SSO 管理工具 - **连接失败**:检查 SSH 配置和网络连接 - **容器未找到**:确认远程服务器上存在包含 "celery" 名称的容器 - **权限错误**:确认用户具有必要的系统权限 -- **参数错误**:检查输入的 ID 和数值是否正确 \ No newline at end of file +- **参数错误**:检查输入的 ID 和数值是否正确 + +### 网络扫描工具 +- **扫描失败**:确认本地网络可以访问目标子网 +- **SSH 连接失败**:检查用户名、密码是否正确,目标设备是否开启 SSH +- **MAC 地址识别失败**:确认 `machine_macs` 字典中包含正确的 MAC 地址映射 +- **并发错误**:降低 `MAX_WORKERS` 参数值 +- **超时错误**:增加 `TIMEOUT` 参数值 \ No newline at end of file diff --git a/sso/scan_burn.py b/sso/scan_burn.py new file mode 100644 index 0000000..07bbafd --- /dev/null +++ b/sso/scan_burn.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 + +import socket +import paramiko +import concurrent.futures +import getpass +import time +from typing import Tuple + +# Define subnet to scan +# SUBNET = "172.16.3" +SUBNET = "172.24.11" +SSH_PORT = 22 +MAX_WORKERS = 10 +TIMEOUT = 0.5 + +machine_macs = { + "24:5d:fc:70:00:01": 1, + "24:5d:fc:70:00:00": 2, + "24:5d:fc:70:00:05": 3, + "24:5d:fc:70:00:06": 4, + "24:5d:fc:70:00:00": 5, + "24:5d:fc:70:01:00": 6, + "24:5d:fc:70:01:01": 7, + "24:5d:fc:70:01:02": 8, + "24:5d:fc:70:01:03": 9, + "24:5d:fc:70:01:04": 10, + "24:5d:fc:70:01:05": 11, + "24:5d:fc:70:01:06": 12, +} + +def check_ssh(ip: str) -> bool: + """Check if SSH port is open on the given IP""" + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(TIMEOUT) + try: + sock.connect((ip, SSH_PORT)) + sock.close() + return True + except: + sock.close() + return False + +def execute_ssh_command(ip: str, password: str) -> Tuple[str, str]: + """SSH to server and execute command""" + client = paramiko.SSHClient() + client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + + result = "" + error = "" + + try: + client.connect(ip, port=SSH_PORT, username='ifanr', password=password, timeout=5) + stdin, stdout, stderr = client.exec_command("cat /sys/class/net/end0/address") + result = stdout.read().decode().strip() + error = stderr.read().decode().strip() + except Exception as e: + error = f"Connection error: {str(e)}" + finally: + client.close() + + return (result, error) + +def main(): + print(f"Scanning for SSH servers on {SUBNET}.1-255...") + + # Ask for password once + # password = getpass.getpass("Enter SSH password: ") + password = "ifanrcool1314" + + start_time = time.time() + + # First scan for open SSH ports + ip_range = [f"{SUBNET}.{i}" for i in range(1, 255)] + available_ips = [] + + with concurrent.futures.ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: + future_to_ip = {executor.submit(check_ssh, ip): ip for ip in ip_range} + + for future in concurrent.futures.as_completed(future_to_ip): + ip = future_to_ip[future] + try: + if future.result(): + print(f"Found SSH server: {ip}") + available_ips.append(ip) + except Exception as e: + print(f"Error scanning {ip}: {e}") + + # Then connect to each available IP and run command + results = {} + + if available_ips: + print(f"\nFound {len(available_ips)} SSH servers. Connecting and getting MAC addresses...") + + with concurrent.futures.ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: + future_to_ip = {executor.submit(execute_ssh_command, ip, password): ip for ip in available_ips} + + for future in concurrent.futures.as_completed(future_to_ip): + ip = future_to_ip[future] + try: + result, error = future.result() + if error: + # results[ip] = f"ERROR: {error}" + pass + else: + results[ip] = result + except Exception as e: + results[ip] = f"EXCEPTION: {str(e)}" + + # Display results + elapsed_time = time.time() - start_time + print(f"\nScan completed in {elapsed_time:.2f} seconds.") + + if results: + print("\nResults:") + for ip in sorted(results.keys()): + mac = results[ip].strip().lower() + print(f"[{machine_macs.get(mac, '-')}] {ip} : {results[ip]}") + else: + print("No SSH servers found.") + +if __name__ == "__main__": + main() diff --git a/sso/scan_burn.sh b/sso/scan_burn.sh new file mode 100755 index 0000000..c2277a6 --- /dev/null +++ b/sso/scan_burn.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +# Define subnet to scan +SUBNET="172.24.11" + +# Define SSH port +SSH_PORT=22 + +# Maximum number of parallel processes +MAX_PROCS=10 + +# Temporary file for results +RESULTS_FILE=$(mktemp) + +echo "Scanning for machines listening on SSH port $SSH_PORT in subnet $SUBNET.128/25..." + +# Start time for performance tracking +START_TIME=$(date +%s) + +# Loop through the IP range with parallel processing +for i in {129..254}; do + IP="$SUBNET.$i" + + # Run scan in background + { + timeout 0.1 bash -c "/dev/null + if [[ $? -eq 0 ]]; then + echo "Success: SSH is listening on $IP" >>"$RESULTS_FILE" + fi + } & + + # Limit the number of background processes - compatible version + while [[ $(jobs -p | wc -l) -ge $MAX_PROCS ]]; do + sleep 0.1 + done +done + +# Wait for all remaining background processes to finish +wait + +# Calculate elapsed time +END_TIME=$(date +%s) +ELAPSED=$((END_TIME - START_TIME)) + +# Display results +echo "Scan completed in $ELAPSED seconds." +if [[ -s "$RESULTS_FILE" ]]; then + echo "Found SSH servers:" + cat "$RESULTS_FILE" | sort +else + echo "No SSH servers found." +fi + +# Cleanup +rm "$RESULTS_FILE" + +