第五轮审计(J1~J16)全量修复 + 子代理 max_turns 钳制: - 子代理 max_turns 钳制(0/None 回退默认 10,负数钳制 1)+ 14 项回归测试 - J1 任务系统投毒:add_memo 入库校验(时间/间隔/类型)、调度器预检与触发事务 防御、展示路径兜底、register 移入 try、add_user_task 补 repeat_end_time 透传 - J2/J13 前端 XSS:三页面 marked 输出经 DOMPurify 净化、entry1 系统消息/任务 分隔条改 textContent、CDN 脚本补 SRI - J3 FTS 删除换序(先 fts 后内容表,索引不再残留) - J5 原子写推广:新增 common/atomic.py(mkstemp+fsync+os.replace),config/prompt/ history 全部接入;损坏配置备份后回退 - J6 单例初始化加锁(PromptManager/ConfigManager 并发首例不双重加载) - J7 broadcast 并发发送 + wait_for 超时回收僵死连接 - J4/J8/J9~J12/J14~J16:验证异常脱敏、交互输入容错、MemoDatabase WAL+busy_timeout、 memo 批量删除、/new 竞态、skills 引号转义、voice_client 清理、死代码移除、 skill_manager 同名键/help 截断
101 lines
3.4 KiB
Python
Executable File
101 lines
3.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
一个基于python-nmap的局域网Ping扫描工具
|
|
"""
|
|
import argparse
|
|
import shlex
|
|
import sys
|
|
import socket
|
|
|
|
def scan_network(network="192.168.1.0/24", timeout=3, verbose=False):
|
|
"""使用nmap -sn模式扫描局域网"""
|
|
try:
|
|
import nmap
|
|
except ImportError:
|
|
print("❌ 错误:缺少 python-nmap 库,请执行: pip install python-nmap")
|
|
sys.exit(1)
|
|
|
|
nm = nmap.PortScanner()
|
|
arguments = f"-sn -T{4 if timeout > 3 else 3} --max-rtt-timeout={timeout * 1000}ms"
|
|
if verbose:
|
|
arguments += " -v"
|
|
|
|
print(f"🔍 正在扫描网段: {network}")
|
|
print(f"⏱️ 超时设置: {timeout}秒")
|
|
print(f"{'📋 详细模式: 开启' if verbose else '📋 详细模式: 关闭'}")
|
|
print("-" * 50)
|
|
|
|
try:
|
|
# J12(审计 2026-08-19):python-nmap 内部把 hosts 拼进 shell 命令
|
|
# 执行——LLM/AI 可控的 network 参数需 shlex.quote,防参数/命令注入
|
|
result = nm.scan(hosts=shlex.quote(network), arguments=arguments)
|
|
except Exception as e:
|
|
print(f"❌ 扫描失败: {e}")
|
|
print("💡 提示:请确保已安装 nmap (sudo apt install nmap) 并有足够权限")
|
|
sys.exit(1)
|
|
|
|
alive_hosts = []
|
|
for host in nm.all_hosts():
|
|
if nm[host].state() == "up":
|
|
alive_hosts.append(host)
|
|
hostname = ""
|
|
try:
|
|
hostname = socket.gethostbyaddr(host)[0]
|
|
except (socket.herror, socket.gaierror):
|
|
hostname = "(未知)"
|
|
|
|
mac = ""
|
|
try:
|
|
if 'mac' in nm[host]['addresses']:
|
|
mac = nm[host]['addresses']['mac']
|
|
except (KeyError, TypeError):
|
|
pass
|
|
|
|
line = f"✅ {host}"
|
|
if verbose:
|
|
if hostname and hostname != "(未知)":
|
|
line += f" [{hostname}]"
|
|
if mac:
|
|
line += f" MAC: {mac}"
|
|
print(line)
|
|
|
|
print("-" * 50)
|
|
print(f"📊 扫描完成!共发现 {len(alive_hosts)} 台在线主机")
|
|
return alive_hosts
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
description="基于python-nmap的局域网Ping扫描工具,快速发现局域网在线设备",
|
|
epilog="""
|
|
参数说明:
|
|
-n NETWORK 指定扫描网段 (默认: 192.168.1.0/24)
|
|
支持格式: 192.168.1.0/24, 192.168.1.1-254, 192.168.1.1
|
|
-t TIMEOUT 超时时间,单位秒 (默认: 3)
|
|
-v 详细输出模式,显示MAC地址和主机名
|
|
--help 显示本帮助信息
|
|
|
|
使用示例:
|
|
nmapskills # 扫描默认网段 192.168.1.0/24
|
|
nmapskills -n 10.0.0.0/24 # 扫描 10.0.0.0/24 网段
|
|
nmapskills -n 192.168.1.1-100 # 扫描 192.168.1.1 到 192.168.1.100
|
|
nmapskills -n 192.168.1.0/24 -t 5 # 扫描并设置5秒超时
|
|
nmapskills -n 192.168.1.0/24 -v # 详细模式扫描
|
|
"""
|
|
)
|
|
|
|
parser.add_argument("-n", default="192.168.1.0/24",
|
|
help="指定扫描网段 (默认: 192.168.1.0/24)")
|
|
parser.add_argument("-t", type=int, default=3,
|
|
help="超时时间,单位秒 (默认: 3)")
|
|
parser.add_argument("-v", action="store_true",
|
|
help="详细输出模式,显示MAC地址和主机名")
|
|
|
|
args = parser.parse_args()
|
|
|
|
scan_network(network=args.n, timeout=args.t, verbose=args.v)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|