同步部署脚本智能体的收尾改动 + 恢复被误删的文件

== 部署脚本(另一个智能体的收尾)==

* deploy.sh 默认两个隧道 unit 都 enable:
    主 lanremote-tunnel      quic  + 8 条 + --metrics :20241
    副本 lanremote-tunnel-h2 http2 + 2 条 + --metrics :20242
  --protocol 支持 both(默认)/ quic / http2,非法值退出码 2
* metrics 端口在两个 unit 里都显式钉死 ——
  实测停掉主实例再重启副实例时,副实例会抢 20241,
  于是 watchdog 和所有按端口读指标的脚本全部读错实例
* MTU/MSS 收成单一出处:net-tune.sh 唯一负责 MSS 1360 + 接口 MTU 1400,
  deploy-tune.sh 只管 keepalive + 开机加速并调用 net-tune.sh。
  这样就不存在"谁后跑谁赢"
* 按需重启:程序和 unit 都用 cmp 比对,一样就不落盘、不重启、
  不 daemon-reload(幂等重跑不再打断正在服务的连接)
* 顺手修了一个会咬人的坑:单独用 --port 9090 时原来只改 unit 不改
  config.yml,隧道会回源到 8080,现象是"隧道通了但一访问就 502"
* 域名:不传 --hostname 且 config.yml 里没有 hostname 时明确停下来
  要输入,不猜、不写 config、不启隧道

测试(三套全绿,实测数字):
  _build/test_deploy_sh.sh        110 通过 / 0 失败(Windows 沙箱)
  _build/test_zip_deploy.sh        30 通过 / 0 失败(从发布 zip 解压再跑)
  _build/test_deploy_device.sh     39 通过 / 0 失败(真机 Debian aarch64)
真机那套桩掉了 systemctl/iptables/ip/sysctl/nmcli
(--prefix 只隔离写文件,不隔离命令副作用),
第 8 节专门验证线上零影响:relay/tunnel/h2 全 active、
MTU=1400、MSS 规则数、keepalive 测前测后完全一致。

== 恢复被误删的文件 ==

排查过程中有人用通配符清了 $env:TEMP\tmp.*,而 Git Bash 的 /tmp
正映射到那个 Windows 目录,导致两个被 git 跟踪的文件被删:
  _build/insert_stub_checks.py
  _build/inspect_pathtest.sh
已从 git 恢复。

教训:用通配符删临时文件很危险,尤其是 /tmp 在 Windows 上
映射到共享目录时。改成只删明确列出的文件名。

== 清理 ==

删掉这轮调试产生的临时输出(reg3.txt / td1.txt / td2.txt 等),
不让它们进仓库。
This commit is contained in:
xmz7891
2026-10-07 18:42:21 +08:00
parent e611b07fb1
commit da40f7572c
23 changed files with 112 additions and 981 deletions
-35
View File
@@ -1,35 +0,0 @@
═══ 1. 默认中转地址确实是空 ═══
[PASS] DEFAULT_RELAY_URL 是空白
═══ 2. RelayLink.start('') 的行为 ═══
[PASS] start('') 返回 False
[PASS] start('') 没有新建线程
[PASS] start('') 之后 candidates 是空的
═══ 3. enable_relay 连续调用两次的返回值 ═══
第 1 次 enable_relay() -> False
第 2 次 enable_relay() -> False
日志: ['没配中转地址,只走局域网(需要跨网络时在设置里填中转地址)', '没配置中转地址,跳过', '没配中转地址,只走局域网(需要跨网络时在设置里填中转地址)']
[PASS] 第 1 次调用返回 False(没有中转可连)
[PASS] 第 2 次调用也应返回 False
═══ 4. 这个返回值会影响谁 ═══
server.py 里调用 enable_relay 的地方:
160: # 顺序很重要:enable_relay() 会挨个试中转地址,
185: self.enable_relay()
全仓库搜索 enable_relay 的调用点:
windows\lanremote\relay.py:317: 对外给 server.enable_relay() 判断用 ——
windows\lanremote\server.py:160: # 顺序很重要:enable_relay() 会挨个试中转地址,
windows\lanremote\server.py:185: self.enable_relay()
windows\lanremote\server.py:308: def enable_relay(self, url: str = "") -> bool:
═══ 5. 空白默认下局域网发现仍可用吗 ═══
[PASS] discovery 模块能导入(不依赖 DEFAULT_RELAY_URL)
[PASS] discover() 能跑完不抛异常
[PASS] discover() 返回的是列表
· 发现到 0 台设备(本机没有 agent 在跑,0 台是正常的)
==============================================================
通过 9 项,失败 0 项
==============================================================
+45
View File
@@ -0,0 +1,45 @@
同步部署脚本智能体的收尾改动 + 恢复被误删的文件
== 部署脚本(另一个智能体的收尾)==
* deploy.sh 默认两个隧道 unit 都 enable:
主 lanremote-tunnel quic + 8 条 + --metrics :20241
副本 lanremote-tunnel-h2 http2 + 2 条 + --metrics :20242
--protocol 支持 both(默认)/ quic / http2,非法值退出码 2
* metrics 端口在两个 unit 里都显式钉死 ——
实测停掉主实例再重启副实例时,副实例会抢 20241,
于是 watchdog 和所有按端口读指标的脚本全部读错实例
* MTU/MSS 收成单一出处:net-tune.sh 唯一负责 MSS 1360 + 接口 MTU 1400,
deploy-tune.sh 只管 keepalive + 开机加速并调用 net-tune.sh。
这样就不存在"谁后跑谁赢"
* 按需重启:程序和 unit 都用 cmp 比对,一样就不落盘、不重启、
不 daemon-reload(幂等重跑不再打断正在服务的连接)
* 顺手修了一个会咬人的坑:单独用 --port 9090 时原来只改 unit 不改
config.yml,隧道会回源到 8080,现象是"隧道通了但一访问就 502"
* 域名:不传 --hostname 且 config.yml 里没有 hostname 时明确停下来
要输入,不猜、不写 config、不启隧道
测试(三套全绿,实测数字):
_build/test_deploy_sh.sh 110 通过 / 0 失败(Windows 沙箱)
_build/test_zip_deploy.sh 30 通过 / 0 失败(从发布 zip 解压再跑)
_build/test_deploy_device.sh 39 通过 / 0 失败(真机 Debian aarch64)
真机那套桩掉了 systemctl/iptables/ip/sysctl/nmcli
(--prefix 只隔离写文件,不隔离命令副作用),
第 8 节专门验证线上零影响:relay/tunnel/h2 全 active、
MTU=1400、MSS 规则数、keepalive 测前测后完全一致。
== 恢复被误删的文件 ==
排查过程中有人用通配符清了 $env:TEMP\tmp.*,而 Git Bash 的 /tmp
正映射到那个 Windows 目录,导致两个被 git 跟踪的文件被删:
_build/insert_stub_checks.py
_build/inspect_pathtest.sh
已从 git 恢复。
教训:用通配符删临时文件很危险,尤其是 /tmp 在 Windows 上
映射到共享目录时。改成只删明确列出的文件名。
== 清理 ==
删掉这轮调试产生的临时输出(reg3.txt / td1.txt / td2.txt 等),
不让它们进仓库。
-55
View File
@@ -1,55 +0,0 @@
[PASS] 真中转起来了
═══ 场景 1:DEVICE_TTL 清理 + allow_new=False 的死亡组合 ═══
[PASS] 设备首次注册成功
[PASS] 关掉「允许新设备接入」成功
[PASS] 【对照】设备还在 devices 里时,老设备能通过开关
等 5 秒让设备超时…
[PASS] 【前提】超时设备已被 snapshot 清出 devices
[PASS] 【前提】该设备的码绑定也已被清(codes 成对清理)
[PASS] 超时清理后老设备仍能重新上线
[PASS] 【归因】打开开关后同一 deviceId 立刻能注册(证明是被开关挡的)
═══ 场景 2:改码 A->B->C 后 codes 里有没有留孤儿 ═══
[PASS] 设备注册(码 A)
[PASS] 改码 A->B 成功
[PASS] 改码 B->C 成功
[PASS] 一台设备只占一个码(codeCount 与设备数一致)
[PASS] 设备当前码是 C
[PASS] 旧码 A 已被释放(另一台设备能占用)
═══ 场景 3:改码之后重启,codes 是否还原成自洽状态 ═══
[PASS] 再改成 B
[PASS] state.json 里该设备只有一条码绑定
═══ 场景 4:deviceId 塞奇怪字符 ═══
[PASS] 非法 deviceId(超长 200 字符)被拒绝而不是崩溃
[PASS] 非法 deviceId(控制字符)被拒绝而不是崩溃
[PASS] 非法 deviceId(路径分隔符)被拒绝而不是崩溃
[PASS] 非法 deviceId(Unicode)被拒绝而不是崩溃
[PASS] 非法 deviceId(只有空格)被拒绝而不是崩溃
═══ 场景 5:并发改码(两个线程同时改同一台设备)═══
[PASS] 并发改码没抛异常
[PASS] 并发后设备还在
[PASS] 并发后设备当前码是 X 或 Y 之一
[PASS] 并发改码后输掉的那个码没有变成孤儿(别的设备能占)
═══ 场景 6:管理接口未鉴权访问 ═══
[PASS] 未鉴权 POST /v1/admin/allow_new 被拒(401/403)
[PASS] 未鉴权 POST /v1/admin/set_code 被拒(401/403)
[PASS] 未鉴权 POST /v1/admin/delete 被拒(401/403)
[PASS] 未鉴权 POST /v1/admin/delete_all 被拒(401/403)
═══ 场景 7:设备列表为空时管理页是否 500 ═══
[PASS] 设备列表为空时管理页仍正常渲染
[PASS] 空列表页面没有 traceback
═══ 场景 8:关掉开关后重启中转,开关状态是否还在 ═══
[PASS] 关掉开关
[PASS] 重启后中转起来了
[PASS] 重启后 allowNew 仍为 False(持久化生效)
==============================================================
通过 34 项,失败 0 项
==============================================================
-55
View File
@@ -1,55 +0,0 @@
[PASS] 真中转起来了
═══ 场景 1:DEVICE_TTL 清理 + allow_new=False 的死亡组合 ═══
[PASS] 设备首次注册成功
[PASS] 关掉「允许新设备接入」成功
[PASS] 【对照】设备还在 devices 里时,老设备能通过开关
等 5 秒让设备超时…
[PASS] 【前提】超时设备已被 snapshot 清出 devices
[PASS] 【前提】该设备的码绑定也已被清(codes 成对清理)
[PASS] 超时清理后老设备仍能重新上线
[PASS] 【归因】打开开关后同一 deviceId 立刻能注册(证明是被开关挡的)
═══ 场景 2:改码 A->B->C 后 codes 里有没有留孤儿 ═══
[PASS] 设备注册(码 A)
[PASS] 改码 A->B 成功
[PASS] 改码 B->C 成功
[PASS] 一台设备只占一个码(codeCount 与设备数一致)
[PASS] 设备当前码是 C
[PASS] 旧码 A 已被释放(另一台设备能占用)
═══ 场景 3:改码之后重启,codes 是否还原成自洽状态 ═══
[PASS] 再改成 B
[PASS] state.json 里该设备只有一条码绑定
═══ 场景 4:deviceId 塞奇怪字符 ═══
[PASS] 非法 deviceId(超长 200 字符)被拒绝而不是崩溃
[PASS] 非法 deviceId(控制字符)被拒绝而不是崩溃
[FAIL] 非法 deviceId(路径分隔符)被拒绝而不是崩溃 —— {'ok': True, 'token': '64c472759d8098f2402a87a5f6d8abd19ec617c6a44ddb93', 'code': '067393', 'note': '', 'pollSeconds': 2.0}
[PASS] 非法 deviceId(Unicode)被拒绝而不是崩溃
[PASS] 非法 deviceId(只有空格)被拒绝而不是崩溃
═══ 场景 5:并发改码(两个线程同时改同一台设备)═══
[PASS] 并发改码没抛异常
[PASS] 并发后设备还在
[PASS] 并发后设备当前码是 X 或 Y 之一
[PASS] 并发改码后输掉的那个码没有变成孤儿(别的设备能占)
═══ 场景 6:管理接口未鉴权访问 ═══
[PASS] 未鉴权 POST /v1/admin/allow_new 被拒(401/403)
[PASS] 未鉴权 POST /v1/admin/set_code 被拒(401/403)
[PASS] 未鉴权 POST /v1/admin/delete 被拒(401/403)
[PASS] 未鉴权 POST /v1/admin/delete_all 被拒(401/403)
═══ 场景 7:设备列表为空时管理页是否 500 ═══
[PASS] 设备列表为空时管理页仍正常渲染
[PASS] 空列表页面没有 traceback
═══ 场景 8:关掉开关后重启中转,开关状态是否还在 ═══
[PASS] 关掉开关
[PASS] 重启后中转起来了
[PASS] 重启后 allowNew 仍为 False(持久化生效)
==============================================================
通过 33 项,失败 1 项
==============================================================
-27
View File
@@ -1,27 +0,0 @@
═══ 复现:管理员关掉「允许新设备接入」,电脑隔夜再开机 ═══
[PASS] ① 电脑首次登记成功
[PASS] ② 管理员关掉「允许新设备接入」
[PASS] ③ 电脑当场重连仍然可以(开关只挡新设备)
… 电脑关机了。等 4 秒模拟“隔夜”(真实是 6 小时)
[PASS] ④ 中转把超时设备清掉了(设计中如此)
磁盘 relay_state.json 里还有这台设备的码绑定: False
内存里 codeCount=0
[PASS] ⑤ 电脑第二天开机 —— 应该能连上
═══ 追问:重启中转能不能救回来? ═══
重启后磁盘里这台设备的码绑定: False
重启后内存 codeCount=0
重启后 allowNew=False
[PASS] ⑥ 重启中转后电脑能连上(说明重启能救回来)
═══ 追问:有没有绕过口子? ═══
[PASS] ⑦ 换新 deviceId 重装 —— 同样被挡(符合开关语义)
[PASS] ⑧ 新 deviceId + 老配对码 —— 也被挡
═══ 对照:打开开关后是否一切恢复 ═══
[PASS] ⑨ 打开开关后原设备恢复
==============================================================
通过 9 项,失败 0 项
==============================================================
-9
View File
@@ -1,9 +0,0 @@
═══ 1. cli_relay_status()(不在 try 里)═══
它打印的内容:
(没有抛异常)
═══ 2. cli_relay(url)(在 try 里)═══
它打印的内容:
返回值: 1
═══ 3. 结论 ═══
-28
View File
@@ -1,28 +0,0 @@
中转端口 59913 被控端端口 59914
中转就绪
被控端登记: 成功
── 照 bench 的顺序:attach -> pair ──
attach: 0ms ok=True session=223aadf1
send pair: 1ms status=200
poll#1: 17ms status=200 收到 102 字节
✓ pair 回复: {"ok": true, "token": "83dbc727003b9fb32c896b4a1a6fd55b", "serverName": "基准测试电脑", "protocol": 1}
ping#1: OK
ping#2: OK
ping#3: OK
ping#4: OK
ping#5: OK
════ 被控端日志(最后 25 行)════
════ 进程还活着吗 ════
agent poll = None
════ 中转日志(最后 10 行)════
[10-07 18:18:24] 中转服务器 v1.8.2 启动,监听 127.0.0.1:59913
[10-07 18:18:24] 长轮询 2 秒 · 队列上限 2048 KB · 数据目录 C:\Users\shu\AppData\Local\Temp\benchdiag_v6uvedpl\r
[10-07 18:18:24] 管理页:http://<本机>:59913/?key=lMvZ9w12vLnidllvR41PFZWg
[10-07 18:18:24] (钥匙也在 C:\Users\shu\AppData\Local\Temp\benchdiag_v6uvedpl\r\admin_key.txt)
[10-07 18:18:25] 被控端上线:基准测试电脑 码 975310 (基准测试电脑-f308c…)
[10-07 18:18:25] 注册请求 -> ok=True
[10-07 18:18:25] 手表接入:基准测试手表 (127.0.0.1) -> 基准测试电脑
-29
View File
@@ -1,29 +0,0 @@
插桩了 4 处
插桩中转起来了
被控端登记: 插桩电脑
手表接入: ok=True
1. pair OK 21ms
2. ping OK 82ms
3. ping OK 4ms
4. ping OK 6ms
════ 插桩日志(中转侧数据流)════
[10-07 17:59:09] [INS] agent/poll 进入,to_agent=0B,current_session=-
[10-07 17:59:10] [INS] client/send 70B -> to_agent 现有 0B,会话 d21cd512,current_session=d21cd512
[10-07 17:59:10] [INS] agent/poll 返回 70B,current_session=d21cd512
[10-07 17:59:10] [INS] agent/poll 进入,to_agent=0B,current_session=d21cd512
[10-07 17:59:10] [INS] agent/send 96B,active_session=d21cd512
[10-07 17:59:10] [INS] client/send 16B -> to_agent 现有 0B,会话 d21cd512,current_session=d21cd512
[10-07 17:59:10] [INS] agent/poll 返回 16B,current_session=d21cd512
[10-07 17:59:10] [INS] agent/poll 进入,to_agent=0B,current_session=d21cd512
[10-07 17:59:10] [INS] agent/send 49B,active_session=d21cd512
[10-07 17:59:10] [INS] client/send 16B -> to_agent 现有 0B,会话 d21cd512,current_session=d21cd512
[10-07 17:59:10] [INS] agent/poll 返回 16B,current_session=d21cd512
[10-07 17:59:10] [INS] agent/poll 进入,to_agent=0B,current_session=d21cd512
[10-07 17:59:10] [INS] agent/send 50B,active_session=d21cd512
[10-07 17:59:10] [INS] client/send 16B -> to_agent 现有 0B,会话 d21cd512,current_session=d21cd512
[10-07 17:59:10] [INS] agent/poll 返回 16B,current_session=d21cd512
[10-07 17:59:10] [INS] agent/poll 进入,to_agent=0B,current_session=d21cd512
[10-07 17:59:10] [INS] agent/send 50B,active_session=d21cd512
════ 被控端日志 ════
-19
View File
@@ -1,19 +0,0 @@
==================================================================
局域网直连 vs 跨网络中转 (每种路径 40 次 cmd:ping)
==================================================================
一、起本地中转(端口 59763)
中转就绪
被控端就绪(局域网在听,中转已上线)
局域网 握手 16 ms 成功 40/40 (100.0%) 中位 0 P90 0 最小 0 最大 0 ms
中转 握手 0 ms 成功 0/ 2 ( 0.0%) 中位 0 P90 0 最小 0 最大 0 ms
连接阶段失败: timed out
==================================================================
对比
==================================================================
有路径没跑通,无法对比
中转 : 连接阶段失败: timed out
BENCH_RESULT lan_median=0 lan_p90=0 lan_ok=40/40 lan_connect=16 relay_median=0 relay_p90=0 relay_ok=0/2 relay_connect=0
**有路径没跑通**
-19
View File
@@ -1,19 +0,0 @@
==================================================================
局域网直连 vs 跨网络中转 (每种路径 30 次 cmd:ping)
==================================================================
一、起本地中转(端口 59815)
中转就绪
被控端就绪(局域网在听,中转已上线)
局域网 握手 17 ms 成功 30/30 (100.0%) 中位 0 P90 0 最小 0 最大 1 ms
中转 握手 0 ms 成功 0/30 ( 0.0%) 中位 0 P90 0 最小 0 最大 0 ms
连接阶段失败: timed out
==================================================================
对比
==================================================================
有路径没跑通,无法对比
中转 : 连接阶段失败: timed out
BENCH_RESULT lan_median=0 lan_p90=0 lan_ok=30/30 lan_connect=17 relay_median=0 relay_p90=0 relay_ok=0/30 relay_connect=0
**有路径没跑通**
-19
View File
@@ -1,19 +0,0 @@
==================================================================
局域网直连 vs 跨网络中转 (每种路径 30 次 cmd:ping)
==================================================================
一、起本地中转(端口 60008)
中转就绪
被控端就绪(局域网在听,中转已上线)
局域网 握手 2 ms 成功 30/30 (100.0%) 中位 0 P90 0 最小 0 最大 0 ms
中转 握手 0 ms 成功 0/30 ( 0.0%) 中位 0 P90 0 最小 0 最大 0 ms
连接阶段失败: timed out
==================================================================
对比
==================================================================
有路径没跑通,无法对比
中转 : 连接阶段失败: timed out
BENCH_RESULT lan_median=0 lan_p90=0 lan_ok=30/30 lan_connect=2 relay_median=0 relay_p90=0 relay_ok=0/30 relay_connect=0
**有路径没跑通**
-20
View File
@@ -1,20 +0,0 @@
==================================================================
局域网直连 vs 跨网络中转 (每种路径 30 次 cmd:ping)
==================================================================
一、起本地中转(端口 60086)
中转就绪
被控端就绪(局域网在听,中转已上线)
局域网 握手 16 ms 成功 30/30 (100.0%) 中位 0 P90 0 最小 0 最大 1 ms
中转 握手 46 ms 成功 30/30 (100.0%) 中位 15 P90 29 最小 1 最大 32 ms
==================================================================
对比
==================================================================
中位延迟 局域网 0.0 ms 中转 15.1 ms -> 局域网快 0.0 倍
P90 延迟 局域网 0 ms 中转 29 ms
握手耗时 局域网 16 ms 中转 46 ms
成功率 局域网 100.0% 中转 100.0%
BENCH_RESULT lan_median=0 lan_p90=0 lan_ok=30/30 lan_connect=16 relay_median=15 relay_p90=29 relay_ok=30/30 relay_connect=46
两条路都跑通了
-20
View File
@@ -1,20 +0,0 @@
[PASS] 基准脚本存在
---- 一、两条路用不同的配对码 ----
[PASS] 定义了局域网用的 code
[PASS] 定义了中转用的 relay_code
[PASS] 两个码不一样(否则第 2 台会被一码一机规则拒掉)
---- 二、attach 要用 relay_code ----
[PASS] 能定位到 relay_connect
[PASS] relay_connect 里用的是 relay_code
[PASS] relay_connect 里没有裸 attach(code)
---- 三、start_agent 的判据要认码 ----
[PASS] start_agent 接受码参数
[PASS] 没有「只看有没有在线设备」的松判据
[PASS] 判据里比对了配对码
---- 四、真跑一遍短基准(两条路都要通)----
[PASS] 基准跑完并输出了 BENCH_RESULT
[PASS] 局域网那条路通了
[PASS] 中转那条路通了
========================================================
通过 13 项,失败 0 项
BIN
View File
Binary file not shown.
-294
View File
@@ -1,294 +0,0 @@
======================================================================
0/7 清理残留进程与端口
======================================================================
端口干净
清掉上次测试残留的 4 个文件
======================================================================
0/7 编码审计(BOM / 行尾 / 乱码)
======================================================================
==========================================================================
✓ 全部通过,没有编码问题
======================================================================
1/7 Python 被控端协议回归
======================================================================
[PASS] 移除后仅剩 1 台
====================================================================
通过 69 项,失败 0 项
======================================================================
1b/7 防火墙阻止规则检测(真机连不上的根因)
======================================================================
====================================================================
通过 43 项,失败 0 项
====================================================================
======================================================================
1c/7 连不上?-> 电脑打开网络自检(UDP 链路)
======================================================================
============================================================
通过 5 项,失败 0 项
======================================================================
1e/7 新增功能(电量/磁盘/性能/进程/剪贴板历史/安全边界)
======================================================================
==============================================================
通过 22 项,失败 0 项
======================================================================
1f/7 电脑功能注册表(39 个功能 + 安全边界 + 可配置)
======================================================================
==============================================================
通过 29 项,失败 0 项
======================================================================
1g/7 功能模糊测试(105 个功能 × 空参数 / 垃圾参数 / 越权路径)
======================================================================
[崩溃] hand_reset({}) -> FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\shu\\AppData\\Local\\Temp\\tmp8myil6kd\\settings.json'
[崩溃] lesson_timer({}) -> FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\shu\\AppData\\Local\\Temp\\tmp8myil6kd\\settings.json'
[崩溃] loop_play({}) -> FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\shu\\AppData\\Local\\Temp\\tmp8myil6kd\\settings.json'
======================================================================
1h/7 端到端(打包后的 EXE:配对 / 功能列表 / 越权 / 防爆破)
======================================================================
==============================================================
通过 13 项,失败 0 项
======================================================================
1i/7 静默模式(0 窗口 / 无终端 / 认证仍生效)
======================================================================
==============================================================
通过 8 项,失败 0 项
======================================================================
1j/7 配一次→零窗口(令牌重连,全程无窗口)
======================================================================
==============================================================
通过 12 项,失败 0 项
======================================================================
1k/7 首次安装设置窗口(出现一次,之后不再出现)
======================================================================
==============================================================
通过 14 项,失败 0 项
======================================================================
1l/7 开机零窗口(照注册表里的自启命令真跑一遍)
======================================================================
==============================================================
通过 7 项,失败 0 项
======================================================================
2/7 手表屏幕布局适配核算 (490x602)
======================================================================
==========================================================================
通过 40 项,失败 0 项
======================================================================
1z/7 手表分页完整性(防白屏:方法定义了必须被调用)
======================================================================
sendMedia: 已被 media() 取代
showInfo: 已被 feature_run 的 info 取代
sp: 旧的字号辅助,已被 dp() 取代
==========================================================
通过 13 项,失败 0 项
======================================================================
2a2/7 APK 内容(诊断已合并进主程序)
======================================================================
通过 15 项,失败 0 项
====================================================================
======================================================================
2a/7 网络调优(MTU 修复)
======================================================================
[PASS] 写了接口 MTU 1400 更差的教训
==========================================================
通过 21 项,失败 0 项
======================================================================
2b/7 投图显示方式(屏幕中间 / 全屏 / 自定义大小)
======================================================================
==============================================================
通过 19 项,失败 0 项
截图目录: C:\Users\shu\Desktop\deepseekagent\LanRemote\_tests\shots
======================================================================
3/7 屏幕共享可见提示(真实界面 + Win32 窗口枚举)
======================================================================
====================================================================
通过 13 项,失败 0 项
======================================================================
2b/7 中转 chunked 请求体(防连接错位)
======================================================================
通过 9 项,失败 0 项
======================================================================
3a/7 局域网直连路径(不经中转)
======================================================================
通过 29 项,失败 0 项
======================================================================
3a2/7 局域网优化(网段掩码 / 发现重发 / 回切)
======================================================================
通过 42 项,失败 0 项
======================================================================
3a3/7 手表局域网切换逻辑(源码断言)
======================================================================
通过 31 项,失败 0 项
======================================================================
3a4/7 编码与换行(.java/.py 必须 UTF-8 无 BOM + LF)
======================================================================
检查 24 个文件,编码/换行全部符合约定
======================================================================
3b/7 Python 静态检查(pyflakes)
======================================================================
✓ 没有会导致崩溃的问题
======================================================================
3b3/7 安装包脚本语法(Inno 的注释陷阱)
======================================================================
[Code] 段落里没有违规写法 ✓
======================================================================
3b4/7 卸载逻辑(不能杀自己 / 不能阻塞)
======================================================================
通过 11 项,失败 0 项
======================================================================
3b2/7 管理页网络体检
======================================================================
通过 15 项,失败 0 项
======================================================================
3b5/7 安装包完整周期(装 -> 验 -> 卸 -> 再验)
======================================================================
通过 20 项,失败 0 项
======================================================================
3b6/7 网页响应头(Content-Type / HEAD)
======================================================================
通过 12 项,失败 0 项
======================================================================
3b7/7 对外材料清洁度(不许出现管理后台)
======================================================================
通过 15 项,失败 0 项
======================================================================
3c/7 中转管理端批量删除
======================================================================
通过 24 项,失败 0 项
======================================================================
3d/7 管理页 JS 合法性(防幽灵按键)
======================================================================
结论:JS 合法,删除按钮能正常工作
======================================================================
3e/7 管理页设备控制(接入开关 + 改配对码)
======================================================================
通过 23 项,失败 0 项
======================================================================
4b/7 手表 Activity 骨架(防白屏)
======================================================================
通过 24 项,失败 0 项
======================================================================
4c/7 编译整个手表 App(含界面代码)
======================================================================
App 编译通过
======================================================================
5/7 编译 Java 协议层
======================================================================
编译通过
======================================================================
6/7 Java <-> 桩服务端 跨语言联调
======================================================================
[PASS] 关闭后 isConnected 为 false
====================================================================
通过 64 项,失败 0 项
======================================================================
7/7 Java <-> 打包后的 EXE 端到端联调
======================================================================
EXE 配对码: 421865
[PASS] 关闭后 isConnected 为 false
====================================================================
通过 64 项,失败 0 项
EXE 接收到的文件:
1,024 B broken.png
307,207 B java_payload.bin
202 B java_photo.png
16,044 B java_sound.wav
======================================================================
验证汇总
======================================================================
项目 结果
-- --
编码审计 PASS
Python 被控端协议回归 PASS
防火墙阻止规则检测 PASS
自检请求链路 PASS
新增功能 PASS
电脑功能注册表 PASS
功能模糊测试 PASS
端到端(打包 EXE) PASS
静默模式 PASS
配一次→零窗口 PASS
首次设置窗口 PASS
开机零窗口 PASS
手表布局适配 PASS
手表分页完整性 PASS
APK 内容 PASS
网络调优(MTU) PASS
投图显示方式 PASS
屏幕共享强制提示 PASS
中转 chunked 请求体 PASS
局域网直连路径 PASS
局域网优化 PASS
手表局域网切换 PASS
编码与换行 PASS
Python 静态检查 PASS
安装包脚本语法 PASS
卸载逻辑 PASS
管理页网络体检 PASS
安装包完整周期 PASS
网页响应头 PASS
对外材料清洁度 PASS
中转批量删除 PASS
管理页 JS 合法性 PASS
管理页设备控制 PASS
手表 Activity 骨架 PASS
手表 App 整体编译 PASS
Java 协议层编译 PASS
Java <-> 桩服务端 PASS
Java <-> 打包 EXE PASS
全部通过
-294
View File
@@ -1,294 +0,0 @@
======================================================================
0/7 清理残留进程与端口
======================================================================
端口干净
清掉上次测试残留的 4 个文件
======================================================================
0/7 编码审计(BOM / 行尾 / 乱码)
======================================================================
==========================================================================
鉁?鍏ㄩ儴閫氳繃锛屾病鏈夌紪鐮侀棶棰?
======================================================================
1/7 Python 被控端协议回归
======================================================================
[PASS] 绉婚櫎鍚庝粎鍓?1 鍙?
====================================================================
閫氳繃 69 椤癸紝澶辫触 0 椤?
======================================================================
1b/7 防火墙阻止规则检测(真机连不上的根因)
======================================================================
====================================================================
閫氳繃 43 椤癸紝澶辫触 0 椤?
====================================================================
======================================================================
1c/7 连不上?-> 电脑打开网络自检(UDP 链路)
======================================================================
============================================================
閫氳繃 5 椤癸紝澶辫触 0 椤?
======================================================================
1e/7 新增功能(电量/磁盘/性能/进程/剪贴板历史/安全边界)
======================================================================
==============================================================
閫氳繃 22 椤癸紝澶辫触 0 椤?
======================================================================
1f/7 电脑功能注册表(39 个功能 + 安全边界 + 可配置)
======================================================================
==============================================================
閫氳繃 29 椤癸紝澶辫触 0 椤?
======================================================================
1g/7 功能模糊测试(105 个功能 × 空参数 / 垃圾参数 / 越权路径)
======================================================================
[宕╂簝] hand_reset({}) -> FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\shu\\AppData\\Local\\Temp\\tmp5d758dnb\\settings.json'
[宕╂簝] lesson_timer({}) -> FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\shu\\AppData\\Local\\Temp\\tmp5d758dnb\\settings.json'
[宕╂簝] loop_play({}) -> FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\shu\\AppData\\Local\\Temp\\tmp5d758dnb\\settings.json'
======================================================================
1h/7 端到端(打包后的 EXE:配对 / 功能列表 / 越权 / 防爆破)
======================================================================
==============================================================
閫氳繃 13 椤癸紝澶辫触 0 椤?
======================================================================
1i/7 静默模式(0 窗口 / 无终端 / 认证仍生效)
======================================================================
==============================================================
閫氳繃 8 椤癸紝澶辫触 0 椤?
======================================================================
1j/7 配一次→零窗口(令牌重连,全程无窗口)
======================================================================
==============================================================
閫氳繃 12 椤癸紝澶辫触 0 椤?
======================================================================
1k/7 首次安装设置窗口(出现一次,之后不再出现)
======================================================================
==============================================================
閫氳繃 14 椤癸紝澶辫触 0 椤?
======================================================================
1l/7 开机零窗口(照注册表里的自启命令真跑一遍)
======================================================================
==============================================================
閫氳繃 7 椤癸紝澶辫触 0 椤?
======================================================================
2/7 手表屏幕布局适配核算 (490x602)
======================================================================
==========================================================================
閫氳繃 40 椤癸紝澶辫触 0 椤?
======================================================================
1z/7 手表分页完整性(防白屏:方法定义了必须被调用)
======================================================================
sendMedia: 宸茶� media() 鍙栦唬
showInfo: 宸茶� feature_run 鐨?info 鍙栦唬
sp: 鏃х殑瀛楀彿杈呭姪锛屽凡琚?dp() 鍙栦唬
==========================================================
閫氳繃 13 椤癸紝澶辫触 0 椤?
======================================================================
2a2/7 APK 内容(诊断已合并进主程序)
======================================================================
閫氳繃 15 椤癸紝澶辫触 0 椤?
====================================================================
======================================================================
2a/7 网络调优(MTU 修复)
======================================================================
[PASS] 鍐欎簡鎺ュ彛 MTU 1400 鏇村樊鐨勬暀璁?
==========================================================
閫氳繃 20 椤癸紝澶辫触 1 椤?
======================================================================
2b/7 投图显示方式(屏幕中间 / 全屏 / 自定义大小)
======================================================================
==============================================================
閫氳繃 19 椤癸紝澶辫触 0 椤?
鎴�浘鐩�綍: C:\Users\shu\Desktop\deepseekagent\LanRemote\_tests\shots
======================================================================
3/7 屏幕共享可见提示(真实界面 + Win32 窗口枚举)
======================================================================
====================================================================
閫氳繃 13 椤癸紝澶辫触 0 椤?
======================================================================
2b/7 中转 chunked 请求体(防连接错位)
======================================================================
閫氳繃 9 椤癸紝澶辫触 0 椤?
======================================================================
3a/7 局域网直连路径(不经中转)
======================================================================
閫氳繃 29 椤癸紝澶辫触 0 椤?
======================================================================
3a2/7 局域网优化(网段掩码 / 发现重发 / 回切)
======================================================================
閫氳繃 42 椤癸紝澶辫触 0 椤?
======================================================================
3a3/7 手表局域网切换逻辑(源码断言)
======================================================================
閫氳繃 31 椤癸紝澶辫触 0 椤?
======================================================================
3a4/7 编码与换行(.java/.py 必须 UTF-8 无 BOM + LF)
======================================================================
妫€鏌?24 涓�枃浠讹紝缂栫爜/鎹㈣�鍏ㄩ儴绗﹀悎绾﹀畾
======================================================================
3b/7 Python 静态检查(pyflakes)
======================================================================
鉁?娌℃湁浼氬�鑷村穿婧冪殑闂��
======================================================================
3b3/7 安装包脚本语法(Inno 的注释陷阱)
======================================================================
[Code] 娈佃惤閲屾病鏈夎繚瑙勫啓娉?鉁?
======================================================================
3b4/7 卸载逻辑(不能杀自己 / 不能阻塞)
======================================================================
閫氳繃 11 椤癸紝澶辫触 0 椤?
======================================================================
3b2/7 管理页网络体检
======================================================================
閫氳繃 15 椤癸紝澶辫触 0 椤?
======================================================================
3b5/7 安装包完整周期(装 -> 验 -> 卸 -> 再验)
======================================================================
閫氳繃 20 椤癸紝澶辫触 0 椤?
======================================================================
3b6/7 网页响应头(Content-Type / HEAD)
======================================================================
閫氳繃 12 椤癸紝澶辫触 0 椤?
======================================================================
3b7/7 对外材料清洁度(不许出现管理后台)
======================================================================
閫氳繃 15 椤癸紝澶辫触 0 椤?
======================================================================
3c/7 中转管理端批量删除
======================================================================
閫氳繃 24 椤癸紝澶辫触 0 椤?
======================================================================
3d/7 管理页 JS 合法性(防幽灵按键)
======================================================================
缁撹�锛欽S 鍚堟硶锛屽垹闄ゆ寜閽�兘姝e父宸ヤ綔
======================================================================
3e/7 管理页设备控制(接入开关 + 改配对码)
======================================================================
閫氳繃 23 椤癸紝澶辫触 0 椤?
======================================================================
4b/7 手表 Activity 骨架(防白屏)
======================================================================
閫氳繃 24 椤癸紝澶辫触 0 椤?
======================================================================
4c/7 编译整个手表 App(含界面代码)
======================================================================
App 编译通过
======================================================================
5/7 编译 Java 协议层
======================================================================
编译通过
======================================================================
6/7 Java <-> 桩服务端 跨语言联调
======================================================================
[PASS] 鍏抽棴鍚?isConnected 涓?false
====================================================================
閫氳繃 64 椤癸紝澶辫触 0 椤?
======================================================================
7/7 Java <-> 打包后的 EXE 端到端联调
======================================================================
EXE 配对码: 193406
[PASS] 鍏抽棴鍚?isConnected 涓?false
====================================================================
閫氳繃 64 椤癸紝澶辫触 0 椤?
EXE 接收到的文件:
1,024 B broken.png
307,207 B java_payload.bin
202 B java_photo.png
16,044 B java_sound.wav
======================================================================
验证汇总
======================================================================
项目 结果
---- ----
编码审计 PASS
Python 被控端协议回归 PASS
防火墙阻止规则检测 PASS
自检请求链路 PASS
新增功能 PASS
电脑功能注册表 PASS
功能模糊测试 PASS
端到端(打包 EXE) PASS
静默模式 PASS
配一次→零窗口 PASS
首次设置窗口 PASS
开机零窗口 PASS
手表布局适配 PASS
手表分页完整性 PASS
APK 内容 PASS
网络调优(MTU) FAIL
投图显示方式 PASS
屏幕共享强制提示 PASS
中转 chunked 请求体 PASS
局域网直连路径 PASS
局域网优化 PASS
手表局域网切换 PASS
编码与换行 PASS
Python 静态检查 PASS
安装包脚本语法 PASS
卸载逻辑 PASS
管理页网络体检 PASS
安装包完整周期 PASS
网页响应头 PASS
对外材料清洁度 PASS
中转批量删除 PASS
管理页 JS 合法性 PASS
管理页设备控制 PASS
手表 Activity 骨架 PASS
手表 App 整体编译 PASS
Java 协议层编译 PASS
Java <-> 桩服务端 PASS
Java <-> 打包 EXE PASS
项失败
Binary file not shown.
-35
View File
@@ -1,35 +0,0 @@
一、准备被控端
[PASS] 配对码已设
[PASS] 中转地址已设
二、起本地中转服务器
[PASS] 中转已启动
三、起被控端(它会主动连中转)
[PASS] 被控端登记到中转并在线
[PASS] 中转看到的配对码正确
[PASS] 中转看到设备名
四、模拟手表接入
[PASS] 接入成功
[PASS] 看到被控端名字
五、经中转发协议命令(这才是真验证)
[PASS] 未配对时 ping 被拒(鉴权仍生效)
[PASS] 配对成功(经中转)
[PASS] 拿到设备令牌
[PASS] 拿到被控端名字
[PASS] 配对后 ping 正常
[PASS] 功能列表经中转返回
[PASS] 执行功能经中转成功
[PASS] 功能真的有输出
[PASS] info 经中转返回
六、换一个手表(中转应该踢掉旧的,被控端应认出新会话)
[PASS] 第二个手表能接入
[PASS] 新会话能用已保存的令牌直接登录
[PASS] 新会话 ping 正常
[PASS] 中转上只剩一个会话
==================================================================
通过 21 项,失败 0 项
+67
View File
@@ -173,3 +173,70 @@ time code ms
2026-10-07 18:20:40 200 1432
2026-10-07 18:20:56 200 1468
2026-10-07 18:21:13 200 1462
2026-10-07 18:21:29 200 1379
2026-10-07 18:21:45 200 1133
2026-10-07 18:22:02 200 1317
2026-10-07 18:22:18 200 1444
2026-10-07 18:22:35 200 1475
2026-10-07 18:22:51 200 1275
2026-10-07 18:23:07 200 1371
2026-10-07 18:23:24 200 1401
2026-10-07 18:23:40 200 1379
2026-10-07 18:23:56 200 1060
2026-10-07 18:24:12 200 1119
2026-10-07 18:25:08 200 41240
2026-10-07 18:25:24 200 849
2026-10-07 18:25:41 200 1726
2026-10-07 18:25:57 200 830
2026-10-07 18:26:13 200 837
2026-10-07 18:26:29 200 908
2026-10-07 18:26:44 200 854
2026-10-07 18:27:25 0 25396
2026-10-07 18:27:41 200 812
2026-10-07 18:27:57 200 903
2026-10-07 18:28:12 200 820
2026-10-07 18:28:28 200 884
2026-10-07 18:28:44 200 814
2026-10-07 18:29:00 200 951
2026-10-07 18:29:16 200 824
2026-10-07 18:29:32 200 823
2026-10-07 18:29:49 200 1882
2026-10-07 18:30:04 200 822
2026-10-07 18:30:20 200 816
2026-10-07 18:30:36 200 742
2026-10-07 18:31:13 200 22350
2026-10-07 18:31:51 200 22209
2026-10-07 18:32:28 200 22508
2026-10-07 18:33:05 200 22096
2026-10-07 18:33:21 200 871
2026-10-07 18:33:37 200 720
2026-10-07 18:33:53 200 881
2026-10-07 18:34:08 200 846
2026-10-07 18:34:24 200 783
2026-10-07 18:34:40 200 824
2026-10-07 18:34:56 200 711
2026-10-07 18:35:33 200 22465
2026-10-07 18:35:50 200 1671
2026-10-07 18:36:06 200 998
2026-10-07 18:36:22 200 1079
2026-10-07 18:36:38 200 1381
2026-10-07 18:36:54 200 1097
2026-10-07 18:37:11 200 1387
2026-10-07 18:37:27 200 1445
2026-10-07 18:37:43 200 1116
2026-10-07 18:38:00 200 1408
2026-10-07 18:38:16 200 1504
2026-10-07 18:38:33 200 1488
2026-10-07 18:38:49 200 1470
2026-10-07 18:39:06 200 1309
2026-10-07 18:39:22 200 1394
2026-10-07 18:39:38 200 1037
2026-10-07 18:39:55 200 1461
2026-10-07 18:40:11 200 1001
2026-10-07 18:40:28 200 2367
2026-10-07 18:40:44 200 1371
2026-10-07 18:41:01 200 1404
2026-10-07 18:41:17 200 1669
2026-10-07 18:41:34 200 1914
2026-10-07 18:41:51 200 1286
2026-10-07 18:42:07 200 1029
1 time code ms
173 2026-10-07 18:20:40 200 1432
174 2026-10-07 18:20:56 200 1468
175 2026-10-07 18:21:13 200 1462
176 2026-10-07 18:21:29 200 1379
177 2026-10-07 18:21:45 200 1133
178 2026-10-07 18:22:02 200 1317
179 2026-10-07 18:22:18 200 1444
180 2026-10-07 18:22:35 200 1475
181 2026-10-07 18:22:51 200 1275
182 2026-10-07 18:23:07 200 1371
183 2026-10-07 18:23:24 200 1401
184 2026-10-07 18:23:40 200 1379
185 2026-10-07 18:23:56 200 1060
186 2026-10-07 18:24:12 200 1119
187 2026-10-07 18:25:08 200 41240
188 2026-10-07 18:25:24 200 849
189 2026-10-07 18:25:41 200 1726
190 2026-10-07 18:25:57 200 830
191 2026-10-07 18:26:13 200 837
192 2026-10-07 18:26:29 200 908
193 2026-10-07 18:26:44 200 854
194 2026-10-07 18:27:25 0 25396
195 2026-10-07 18:27:41 200 812
196 2026-10-07 18:27:57 200 903
197 2026-10-07 18:28:12 200 820
198 2026-10-07 18:28:28 200 884
199 2026-10-07 18:28:44 200 814
200 2026-10-07 18:29:00 200 951
201 2026-10-07 18:29:16 200 824
202 2026-10-07 18:29:32 200 823
203 2026-10-07 18:29:49 200 1882
204 2026-10-07 18:30:04 200 822
205 2026-10-07 18:30:20 200 816
206 2026-10-07 18:30:36 200 742
207 2026-10-07 18:31:13 200 22350
208 2026-10-07 18:31:51 200 22209
209 2026-10-07 18:32:28 200 22508
210 2026-10-07 18:33:05 200 22096
211 2026-10-07 18:33:21 200 871
212 2026-10-07 18:33:37 200 720
213 2026-10-07 18:33:53 200 881
214 2026-10-07 18:34:08 200 846
215 2026-10-07 18:34:24 200 783
216 2026-10-07 18:34:40 200 824
217 2026-10-07 18:34:56 200 711
218 2026-10-07 18:35:33 200 22465
219 2026-10-07 18:35:50 200 1671
220 2026-10-07 18:36:06 200 998
221 2026-10-07 18:36:22 200 1079
222 2026-10-07 18:36:38 200 1381
223 2026-10-07 18:36:54 200 1097
224 2026-10-07 18:37:11 200 1387
225 2026-10-07 18:37:27 200 1445
226 2026-10-07 18:37:43 200 1116
227 2026-10-07 18:38:00 200 1408
228 2026-10-07 18:38:16 200 1504
229 2026-10-07 18:38:33 200 1488
230 2026-10-07 18:38:49 200 1470
231 2026-10-07 18:39:06 200 1309
232 2026-10-07 18:39:22 200 1394
233 2026-10-07 18:39:38 200 1037
234 2026-10-07 18:39:55 200 1461
235 2026-10-07 18:40:11 200 1001
236 2026-10-07 18:40:28 200 2367
237 2026-10-07 18:40:44 200 1371
238 2026-10-07 18:41:01 200 1404
239 2026-10-07 18:41:17 200 1669
240 2026-10-07 18:41:34 200 1914
241 2026-10-07 18:41:51 200 1286
242 2026-10-07 18:42:07 200 1029
View File
-23
View File
@@ -1,23 +0,0 @@
════════ 场景 A:两条路用同一个配对码(复刻 bench 现状)════════
第 1 台(跑局域网): 登记=True 设备数=1
已停掉第 1 台
第 2 台(跑中转): start_agent 认为登记=True
中转上看到的设备: 验码电脑 码 246813 在线=True 空闲=1s
场景A pair **超时**(没人回包)
── 中转日志里有没有『码被占用』──
[10-07 18:18:56] 配对码 246813 已被 验码电脑-b0dd7aae76ba 占用,拒绝 验码电脑-b6bfc86f574a
[10-07 18:19:02] 配对码 246813 已被 验码电脑-b0dd7aae76ba 占用,拒绝 验码电脑-b6bfc86f574a
[10-07 18:19:08] 配对码 246813 已被 验码电脑-b0dd7aae76ba 占用,拒绝 验码电脑-b6bfc86f574a
════════ 场景 B:两条路各用不同的配对码(修法)════════
第 1 台: 登记=True
第 2 台: 登记=True
场景B pair 成功: {"ok": true, "token": "0fe2d1ed61da6cd489230490d4a77a72", "serverName": "验码电脑",
════════ 结论 ════════
场景 A(同一个码): **不通**
场景 B(不同码) : 通
→ 假设成立:bench 失败是因为两条路用了同一个配对码,
第 2 台被「一码一机」规则拒掉,而 start_agent
看到第 1 台还挂在线就以为成功了。**产品没问题。**
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 393 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB