Skill: nary24/openwrt-router (version 1.0.3)

--- name: ai管理openwrt description: OpenWRT 路由器管理与监控。通过 LuCI Web 接口（无 SSH 依赖）管理 OpenWRT 路由器，支持 DHCP 租约查询、在线设备列表查看、WiFi 客户端管理、网络状态监控等。当用户提到路由器管理、查看联网设备、WiFi 状态、DHCP 租约、OpenWRT/LEDE 等时触发。 --- # OpenWRT Router ## 概述 通过 LuCI RPC API 远程管理 OpenWRT 路由器，无需 SSH 或 telnet。使用 curl + HTTP Cookie 认证，通过 `cgi-bin/luci/rpc/sys` 接口执行 shell 命令。 ## 原理 ### 认证流程 1. 用用户名/密码 POST 登录 LuCI 登录页面 2. 保存返回的 `sysauth` cookie 3. 用 cookie + RPC API 执行命令 ### RPC API 地址 ``` POST http://<router-ip>/cgi-bin/luci/rpc/sys?auth=<sysauth_token> ``` 参数为 JSON: `{"method":"exec","params":["<shell_command>"]}` 返回 JSON: `{"id":null,"result":"<stdout>","error":null}` ## 多路由器管理 支持同时管理多台 OpenWRT 路由器，通过别名（如 "家"、"租房"）来区分。 ### 配置方式 在 `TOOLS.md` 中记录路由器信息： ```markdown ### OpenWRT 路由器 - **家** - IP: 192.168.123.1 - 用户: root - 密码: xxx - **租房** - IP: 192.168.125.1 - 用户: root - 密码: xxx ``` ### 使用方式 用户可以说： - "看看家里路由器的联网情况" - "租房那边有人蹭网吗" - "查一下家里的 DHCP 租约" - "看看租房装了哪些软件" ### 网络打通的情况 如果路由器之间网络已打通（如通过 WireGuard、Tailscale、FRP 等），一台机器就可以直接管理所有路由器，只需切换目标 IP 即可。 ## 前置条件 - 需要 `curl` 命令 - 用户提供：路由器 IP、用户名、密码（或记录在 TOOLS.md 中） ## 核心操作 ### 1. 登录路由器 ```bash curl -s -m 10 -X POST "http://<router_ip>/cgi-bin/luci/" \ -d "luci_username=root&luci_password=<password>" \ -c /tmp/luci_cookies.txt ``` 登录成功后 cookie 文件包含 `sysauth` token。 ### 2. 执行命令 ```bash SYS_AUTH=$(grep sysauth /tmp/luci_cookies.txt | awk '{print $NF}') curl -s -m 10 -b /tmp/luci_cookies.txt \ -H "Content-Type: application/json" \ -X POST "http://<router_ip>/cgi-bin/luci/rpc/sys?auth=$SYS_AUTH" \ -d '{"method":"exec","params":["<command>"]}' ``` ### 3. 常用命令 #### 查看联网设备（综合查询） **推荐方式**：同时查询DHCP租约、ARP表和WiFi设备，获取完整的联网设备列表。 ```bash # 1. DHCP租约 - 显示通过DHCP获取IP的设备 cat /tmp/dhcp.leases # 2. ARP表 - 显示所有活跃设备（包括静态IP设备） cat /proc/net/arp # 3. WiFi连接设备 iwinfo phy0-ap0 assoclist # 2.4G iwinfo phy1-ap0 assoclist # 5G ``` **设备发现优先级**： 1. **ARP表** - 最全面，显示所有在局域网中活跃的设备（包括静态IP） 2. **WiFi列表** - 显示无线连接设备及信号强度 3. **DHCP租约** - 仅显示通过DHCP获取IP的设备 #### 查看 DHCP 租约（通过DHCP获取IP的设备） ```bash cat /tmp/dhcp.leases ``` 输出格式：`租约过期时间 MAC地址 IP地址 主机名` #### 查看 ARP 表（所有活跃设备） ```bash cat /proc/net/arp ``` 输出格式：`IP地址 硬件类型 标志 MAC地址 掩码 设备` #### 查看 WiFi 连接设备 ```bash iwinfo <interface> assoclist ``` 先用以下命令查看无线接口名： ```bash iwinfo 2>/dev/null | grep ESSID # 或 iw dev ``` #### 查看无线接口列表 ```bash ls /sys/class/net/ # 用 grep 过滤 ESSID iwinfo 2>/dev/null | grep -E "ESSID" ``` #### 获取系统负载/运行时间 ```bash uptime cat /proc/loadavg ``` #### 查看活跃连接数 ```bash cat /proc/net/nf_conntrack 2>/dev/null | wc -l ``` ### 4. 数据解析示例 从 DHPC 租约拿到纯文本后用 `\u000a`（Python 的 `\n` 换行 Unicode 转义）分隔行： ```json {"result": "MAC1 IP1 Name1\u000aMAC2 IP2 Name2\u000a"} ``` WiFi assoclist 输出格式： ``` MAC_ADDRESS -XX dBm / -XX dBm (SNR XX) XXX ms ago RX: XX MBit/s, MCS X, XXMHz XXX Pkts. TX: XX MBit/s, MCS X, XXMHz XXX Pkts. ``` - `RX` = 接收速率 - `TX` = 发送速率 - `dBm` 越小信号越差（负值） - `SNR` = 信噪比，越高越好 ## 使用流程 ```mermaid flowchart TD A[用户提供路由器信息] --> B[cURL 登录 LuCI] B --> C{登录成功?} C -->|是| D[获取 DHCP 租约] C -->|否| E[返回错误信息] D --> F[获取 ARP 表] F --> G[获取 WiFi 连接设备] G --> H[合并去重设备列表] H --> I[解析并展示结果] ``` ### 设备发现策略 为了全面显示联网设备，需要综合使用以下三种方式： 1. **DHCP租约** - 显示通过DHCP获取IP的设备名称 2. **ARP表** - 显示所有活跃设备（包括静态IP设备） 3. **WiFi列表** - 显示无线连接设备及信号强度 **合并逻辑**： - 以MAC地址为主键合并三个数据源 - ARP表提供IP和MAC对应关系 - DHCP租约提供设备名称 - WiFi列表提供信号强度和连接状态 ### 完整示例（Python） ```python import json, subprocess def router_api(ip, password, cmd): # 1. 登录 subprocess.run(["curl", "-s", "-m", "10", "-X", "POST", f"http://{ip}/cgi-bin/luci/", "-d", f"luci_username=root&luci_password={password}", "-c", "/tmp/luci_cookies.txt"]) # 2. 获取 auth with open("/tmp/luci_cookies.txt") as f: for line in f: if "sysauth" in line: [REDACTED_SECRET]).split()[-1] # 3. 执行命令 r = subprocess.run(["curl", "-s", "-m", "10", "-b", "/tmp/luci_cookies.txt", "-H", "Content-Type: application/json", "-X", "POST", f"http://{ip}/cgi-bin/luci/rpc/sys?auth={token}", "-d", json.dumps({"method": "exec", "params": [cmd]})], capture_output=True, text=True) return json.loads(r.stdout).get("result", "") ``` ## 注意事项 - 密码中含有特殊字符（如 `@`、`#`、`$`）时，curl 的 `-d` 参数需要使用引号包裹 - 某些 OpenWRT 版本可能需要额外的 cookie 路径设置 - 执行结果中含 `\u000a` 是 Unicode 换行符转义，需要 Python 的 `decode("unicode_escape")` 或 JSON 反序列化自动处理 - RPC API 返回的 `error` 字段为 `null` 表示成功 - 不是所有 OpenWRT 固件都预装 `iwinfo` 命令（新版可能用 `iw` 替代）


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal:  | SkillSpector: suspicious (CRITICAL)