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
This commit is contained in:
parent
40dcc0db8c
commit
ac1fc4421a
@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
- `run_sso_script.sh` - 主要执行脚本,负责将 Python 脚本上传到远程服务器并执行
|
- `run_sso_script.sh` - 主要执行脚本,负责将 Python 脚本上传到远程服务器并执行
|
||||||
- `sso_script.py` - Django 交互式管理脚本,提供 SSO 系统的各种管理功能
|
- `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 连接到远程服务器
|
- 确保可以通过 SSH 连接到远程服务器
|
||||||
- 远程服务器上存在包含 "celery" 名称的 Proxmox 容器
|
- 远程服务器上存在包含 "celery" 名称的 Proxmox 容器
|
||||||
|
|
||||||
### 执行步骤
|
3. **网络扫描工具依赖**:
|
||||||
|
- `scan_burn.py` 需要 Python 3 和 paramiko 库:`pip install paramiko`
|
||||||
|
- `scan_burn.sh` 需要 bash 环境支持
|
||||||
|
|
||||||
|
### SSO 管理工具使用步骤
|
||||||
|
|
||||||
1. **运行主脚本**:
|
1. **运行主脚本**:
|
||||||
```bash
|
```bash
|
||||||
@ -71,6 +89,43 @@
|
|||||||
- **功能2**:输入商品ID、批次ID、开始流水号、结束流水号
|
- **功能2**:输入商品ID、批次ID、开始流水号、结束流水号
|
||||||
- **功能3**:输入新商品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
|
#### 示例1:创建 50 个 XDP Ultra Redeem Code
|
||||||
@ -97,24 +152,57 @@
|
|||||||
请输入结束流水号 (stop): 1100
|
请输入结束流水号 (stop): 1100
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### 示例4:扫描网络设备
|
||||||
|
```bash
|
||||||
|
# 使用 bash 版本快速扫描
|
||||||
|
./scan_burn.sh
|
||||||
|
|
||||||
|
# 使用 Python 版本获取详细信息
|
||||||
|
python3 scan_burn.py
|
||||||
|
```
|
||||||
|
|
||||||
## 技术架构
|
## 技术架构
|
||||||
|
|
||||||
- **远程执行**:使用 SSH 和 Proxmox 容器技术
|
- **远程执行**:使用 SSH 和 Proxmox 容器技术
|
||||||
- **Django 集成**:脚本运行在 Django 环境中,可访问相关数据模型
|
- **Django 集成**:脚本运行在 Django 环境中,可访问相关数据模型
|
||||||
- **数据处理**:使用 MongoDB 和 FlexEngine 进行数据操作
|
- **数据处理**:使用 MongoDB 和 FlexEngine 进行数据操作
|
||||||
- **许可证管理**:集成许可证颁发和管理系统
|
- **许可证管理**:集成许可证颁发和管理系统
|
||||||
|
- **网络扫描**:使用多线程并发扫描和 SSH 连接技术
|
||||||
|
- **设备识别**:基于 MAC 地址的设备识别和映射
|
||||||
|
|
||||||
## 注意事项
|
## 注意事项
|
||||||
|
|
||||||
1. **权限要求**:需要远程服务器的 root 权限
|
1. **权限要求**:
|
||||||
2. **网络连接**:确保与远程服务器的网络连通性
|
- SSO 管理工具需要远程服务器的 root 权限
|
||||||
3. **数据安全**:操作涉及生产数据,请谨慎使用
|
- 网络扫描工具需要目标设备的 SSH 访问权限
|
||||||
|
|
||||||
|
2. **网络连接**:
|
||||||
|
- 确保与远程服务器的网络连通性
|
||||||
|
- 网络扫描工具需要在目标网络内执行
|
||||||
|
|
||||||
|
3. **数据安全**:
|
||||||
|
- 操作涉及生产数据,请谨慎使用
|
||||||
|
- 网络扫描可能触发安全告警,请确保已获得授权
|
||||||
|
|
||||||
4. **错误处理**:脚本包含基本错误处理,如遇问题请检查输入参数
|
4. **错误处理**:脚本包含基本错误处理,如遇问题请检查输入参数
|
||||||
|
|
||||||
5. **清理机制**:脚本会自动清理远程临时文件,无需手动操作
|
5. **清理机制**:脚本会自动清理远程临时文件,无需手动操作
|
||||||
|
|
||||||
|
6. **性能优化**:
|
||||||
|
- 网络扫描工具使用多线程并发,可根据网络情况调整并发数
|
||||||
|
- 扫描大量设备时建议适当增加超时时间
|
||||||
|
|
||||||
## 故障排除
|
## 故障排除
|
||||||
|
|
||||||
|
### SSO 管理工具
|
||||||
- **连接失败**:检查 SSH 配置和网络连接
|
- **连接失败**:检查 SSH 配置和网络连接
|
||||||
- **容器未找到**:确认远程服务器上存在包含 "celery" 名称的容器
|
- **容器未找到**:确认远程服务器上存在包含 "celery" 名称的容器
|
||||||
- **权限错误**:确认用户具有必要的系统权限
|
- **权限错误**:确认用户具有必要的系统权限
|
||||||
- **参数错误**:检查输入的 ID 和数值是否正确
|
- **参数错误**:检查输入的 ID 和数值是否正确
|
||||||
|
|
||||||
|
### 网络扫描工具
|
||||||
|
- **扫描失败**:确认本地网络可以访问目标子网
|
||||||
|
- **SSH 连接失败**:检查用户名、密码是否正确,目标设备是否开启 SSH
|
||||||
|
- **MAC 地址识别失败**:确认 `machine_macs` 字典中包含正确的 MAC 地址映射
|
||||||
|
- **并发错误**:降低 `MAX_WORKERS` 参数值
|
||||||
|
- **超时错误**:增加 `TIMEOUT` 参数值
|
||||||
123
sso/scan_burn.py
Normal file
123
sso/scan_burn.py
Normal file
@ -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()
|
||||||
57
sso/scan_burn.sh
Executable file
57
sso/scan_burn.sh
Executable file
@ -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/tcp/$IP/$SSH_PORT" &>/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"
|
||||||
|
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user