mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 14:50:45 +00:00
被控端 - 修复 MTU 问题:夹 MSS + 路径 MTU 探测(公网可用率 48% -> 100%) - 复用 HTTP 连接(免掉每次新建 TLS 的 30% 握手失败) - 每分钟回头找局域网,自动切回快 400 倍的路径 - 画面心跳帧:静止时省流量,客户端仍知道流是活的 - 锁屏时给出可操作的提示 手表端 - 内置 GTS Root R4 / GlobalSign Root CA,修 SSLHandshakeException - 连接错误翻译成人话(证书/时间/解析/超时分别提示) - 经中转连上后用服务器报的地址刷新已配对记录 - 新增局域网连接页面、服务器延迟检测 服务器端 - 支持 chunked 请求体(修每 16 秒一次的连接错乱与大面积 502) - 网络调优脚本 net-tune.sh(开机自动应用) - 管理页:批量删除、网络体检、下载区 - 隧道改 HTTP/2 + 双连接 文档 - 许可协议 / 安装前必读 / 安装后须知(作者:小麦子)
194 lines
6.5 KiB
Python
194 lines
6.5 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""生成「工具箱.bat」—— 被控端目录的统一入口。
|
||
|
||
原来工具是散的:一键修复防火墙.bat / 网络自检.bat 各自双击,
|
||
用户不知道该点哪个。这里合成一个菜单,双击即用。
|
||
|
||
.bat 的两个硬性要求(真机踩过):
|
||
1. CRLF 换行 —— 裸 LF 会让 cmd 逐段误读,命令全变无效
|
||
2. GBK 编码 + chcp 936 —— 中文 Windows 的 cmd 默认代码页
|
||
生成后做字节级自检。
|
||
"""
|
||
from __future__ import annotations
|
||
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
VERSION = "1.3.0"
|
||
|
||
LINES = [
|
||
"@echo off",
|
||
"chcp 936 >nul",
|
||
"title 局域网遥控 . 工具箱",
|
||
'cd /d "%~dp0"',
|
||
"",
|
||
":MENU",
|
||
"cls",
|
||
"echo ============================================================",
|
||
"echo 局域网遥控 . 工具箱 版本 " + VERSION,
|
||
"echo ============================================================",
|
||
"echo.",
|
||
"echo 1. 启动被控端 日常使用就点这个",
|
||
"echo 2. 一键修复防火墙 连不上时先试这个(需要管理员)",
|
||
"echo 3. 网络自检 还连不上就用它排查",
|
||
"echo 4. 查看使用说明",
|
||
"echo 5. 查看运行日志",
|
||
"echo 6. 打开接收文件夹",
|
||
"echo 7. 查看当前防火墙状态",
|
||
"echo.",
|
||
"echo 0. 退出",
|
||
"echo.",
|
||
'set "CHOICE="',
|
||
"set /p CHOICE= 请选择 [0-7]: ",
|
||
"",
|
||
'if "%CHOICE%"=="1" goto START_AGENT',
|
||
'if "%CHOICE%"=="2" goto FIX_FW',
|
||
'if "%CHOICE%"=="3" goto NETCHECK',
|
||
'if "%CHOICE%"=="4" goto SHOW_README',
|
||
'if "%CHOICE%"=="5" goto SHOW_LOG',
|
||
'if "%CHOICE%"=="6" goto OPEN_RECV',
|
||
'if "%CHOICE%"=="7" goto SHOW_FW',
|
||
'if "%CHOICE%"=="0" exit /b 0',
|
||
"goto MENU",
|
||
"",
|
||
"rem ------------------------------------------------------------",
|
||
":START_AGENT",
|
||
'if not exist "ykxmz.exe" goto NO_EXE',
|
||
"echo.",
|
||
"echo 正在启动被控端 ...",
|
||
'start "" "ykxmz.exe"',
|
||
"ping -n 3 127.0.0.1 >nul",
|
||
"echo 已启动。关掉窗口程序仍在后台运行,",
|
||
"echo 再双击一次 exe 可以把窗口叫回来。",
|
||
"echo.",
|
||
"pause",
|
||
"goto MENU",
|
||
"",
|
||
"rem ------------------------------------------------------------",
|
||
":FIX_FW",
|
||
'if not exist "一键修复防火墙.bat" goto NO_FIX',
|
||
"echo.",
|
||
"echo 即将以管理员身份运行防火墙修复脚本。",
|
||
"echo 弹出的 UAC 窗口请点「是」。",
|
||
"echo.",
|
||
"pause",
|
||
'call "一键修复防火墙.bat"',
|
||
"goto MENU",
|
||
"",
|
||
"rem ------------------------------------------------------------",
|
||
":NETCHECK",
|
||
'if not exist "网络自检.bat" goto NO_NET',
|
||
"echo.",
|
||
'call "网络自检.bat"',
|
||
"goto MENU",
|
||
"",
|
||
"rem ------------------------------------------------------------",
|
||
":SHOW_README",
|
||
'if exist "使用说明.txt" start "" notepad "使用说明.txt"',
|
||
'if not exist "使用说明.txt" if exist "先看这个.txt" start "" notepad "先看这个.txt"',
|
||
"goto MENU",
|
||
"",
|
||
"rem ------------------------------------------------------------",
|
||
":SHOW_LOG",
|
||
'if not exist "data\\运行日志.txt" goto NO_LOG',
|
||
'start "" notepad "data\\运行日志.txt"',
|
||
"goto MENU",
|
||
"",
|
||
"rem ------------------------------------------------------------",
|
||
":OPEN_RECV",
|
||
'if not exist "received" mkdir "received"',
|
||
'start "" "received"',
|
||
"goto MENU",
|
||
"",
|
||
"rem ------------------------------------------------------------",
|
||
":SHOW_FW",
|
||
"echo.",
|
||
"echo ---- 端口放行规则 ----",
|
||
'netsh advfirewall firewall show rule name="LAN Remote TCP" | findstr /C:"规则名称" /C:"Rule Name" /C:"已启用" /C:"Enabled" /C:"操作" /C:"Action" /C:"本地端口" /C:"LocalPort"',
|
||
'netsh advfirewall firewall show rule name="LAN Remote UDP" | findstr /C:"规则名称" /C:"Rule Name" /C:"已启用" /C:"Enabled" /C:"操作" /C:"Action"',
|
||
"echo.",
|
||
"echo ---- 程序级放行规则(治本那条)----",
|
||
'netsh advfirewall firewall show rule name="LAN Remote App TCP" verbose | findstr /C:"规则名称" /C:"Rule Name" /C:"已启用" /C:"Enabled" /C:"程序" /C:"Program" /C:"操作" /C:"Action"',
|
||
"echo.",
|
||
"echo ---- 阻止规则(有的话会压过放行)----",
|
||
'netsh advfirewall firewall show rule name="lanremote-agent.exe" dir=in | findstr /C:"规则名称" /C:"Rule Name" /C:"操作" /C:"Action" /C:"程序" /C:"Program"',
|
||
"echo.",
|
||
"echo 如果上面「阻止规则」出现了内容,就点菜单 2 修复。",
|
||
"echo.",
|
||
"pause",
|
||
"goto MENU",
|
||
"",
|
||
"rem ------------------------------------------------------------",
|
||
":NO_EXE",
|
||
"echo.",
|
||
"echo [错误] 没找到 ykxmz.exe",
|
||
"echo 请确认本脚本和被控端 exe 在同一个文件夹里。",
|
||
"echo.",
|
||
"pause",
|
||
"goto MENU",
|
||
"",
|
||
":NO_FIX",
|
||
"echo.",
|
||
"echo [错误] 没找到 一键修复防火墙.bat",
|
||
"echo.",
|
||
"pause",
|
||
"goto MENU",
|
||
"",
|
||
":NO_NET",
|
||
"echo.",
|
||
"echo [错误] 没找到 网络自检.bat",
|
||
"echo.",
|
||
"pause",
|
||
"goto MENU",
|
||
"",
|
||
":NO_LOG",
|
||
"echo.",
|
||
"echo 还没有运行日志(程序没启动过)。",
|
||
"echo.",
|
||
"pause",
|
||
"goto MENU",
|
||
]
|
||
|
||
|
||
def build_text() -> str:
|
||
return "\n".join(LINES) + "\n"
|
||
|
||
|
||
def write(target: Path) -> int:
|
||
target.parent.mkdir(parents=True, exist_ok=True)
|
||
with open(target, "w", encoding="gbk", newline="\r\n") as handle:
|
||
handle.write(build_text())
|
||
|
||
data = target.read_bytes()
|
||
crlf = data.count(b"\r\n")
|
||
lone = data.count(b"\n") - crlf
|
||
has_bom = data[:3] == b"\xef\xbb\xbf"
|
||
text = data.decode("gbk")
|
||
|
||
print(f" 路径: {target}")
|
||
print(f" 大小: {len(data)} 字节 CRLF={crlf} 裸LF={lone} BOM={has_bom}")
|
||
|
||
problems = []
|
||
if lone:
|
||
problems.append(f"存在 {lone} 处裸 LF(cmd 会解析错乱)")
|
||
if has_bom:
|
||
problems.append("存在 UTF-8 BOM")
|
||
for probe in ("局域网遥控", "启动被控端", "一键修复防火墙", "网络自检"):
|
||
if probe not in text:
|
||
problems.append(f"缺少内容「{probe}」")
|
||
if problems:
|
||
for item in problems:
|
||
print(f" [失败] {item}")
|
||
return 1
|
||
print(" 自检: 通过")
|
||
return 0
|
||
|
||
|
||
def main() -> int:
|
||
root = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote")
|
||
return write(root / "tools" / "工具箱.bat")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
sys.exit(main())
|