v1.4.2

MCP 运维套件 & WebSocket 传输 & 抓屏健壮性

距 v1.4.1 约 11 天,跨 70 次提交。本版本有两条主线:一是把 MCP 从「查询 + 远控」扩成一套完整的运维接口——工具从 27 个增至 60 个,协议层做齐取消、进度、预演与结构化错误,端点自身提供 HTTPS 与失败限流;二是新增 WebSocket 传输,让只有 80 / 443 出站放行的网络也能上线,并允许主控把已在线客户端远程切到 WS / WSS。此外集中修了 Windows 端抓屏在旋转显示器、无交互桌面上的黑屏,以及 Web 端在 iOS 上的幽灵线与竖屏输入法指针错位。

MCP:从 27 个工具到 60 个

  • 主机管理与连接管理(16 个):连接列表 / 强制断开;进程、窗口、网络状态、软件、浏览记录、收藏夹、Win32 与驱动服务、计划任务、HOSTS 文件,以及冻结进程、还原隐藏窗口、启停服务、运行计划任务四个写工具。写操作执行前重读快照、执行后再复核,目标已失效时回 -32009 而不是盲发;整族受「启用主机管理」控制,高风险子集另受「危险主机操作」控制
  • 远程交谈(4 个):复用客户端既有的聊天子连接,受独立开关控制;文本在 UTF-8 与 CP936 之间严格转换,GBK 无法表示的字符直接报错而不是变成问号
  • 文件系统写入(3 个):delete_path / move_path / create_folder,独立开关且要求关闭只读——上传是覆盖、删除是毁灭,必须能分别关掉。一律拒绝盘符 / 共享根、系统目录树与 %VAR%;客户端对这些命令无条件回完成包,所以 ok 只代表已送达,真实结果看 verified
  • 主机间直传:copy_files_c2c 让源主机直接把文件推给另一台在线主机,服务端只中继不落盘;目标可以是 Windows 或 Linux / macOS
  • 锁定键鼠与会话排障:remote_block_input 必须带截止时间(默认 5 分钟),看门狗每 500 ms 清理过期锁并主动解锁;mcp_list_sessions / mcp_cancel_session 用来查是谁占着主机、把卡住的调用取消掉,两者刻意不受任何开关约束——这是卡住时唯一的出口
  • 查询增强:离线主机记录、最多 50 台的批量只读调用、分组 / 系统 / 客户端类型过滤、活动历史与客户端日志分页(各带体积上限)

MCP:协议与端点

  • 协议层:initialize 返回五段说明(主机 ID 从哪来、哪个开关隐藏哪些工具、每个错误码意味着下一步做什么),能力上报把 remoteControl / fileTransferV2 / c2cPaths 等标志与真正生效的门控同源;工具注解补齐只读 / 破坏性 / 幂等 / 开放世界四类提示
  • 取消与进度:长任务每 500 ms 检查取消标志,主机 1 秒内释放,取消导致的失败以 -32800 结束;带 progressToken 的调用按 SSE 回进度通知
  • 预演:kill_process、operate_window 与 host_control_* 支持 dry_run,只对新快照校验目标并返回「将会影响什么」
  • 失败不再一律超时:客户端新增 4 个结构化失败令牌,list_services 在非管理员客户端上由 20 秒超时变为亚秒级 -32010,路径 / 注册表键不存在回 -32009,下载无可用文件回 -32010
  • 端点加固:MCP 端口由小前端接管,按首字节嗅探 Schannel 握手后转发明文,支持 RSA 与 ECDSA、支持 fullchain,证书不可用时 fail-closed 而非回退明文;请求体上限 2 MB、读 15 秒 / 写 60 秒超时;Bearer 失败按源 IP 限流(1 分钟 10 次封 15 分钟,回环来源只记账),鉴权失败与工具调用写审计日志

WebSocket 传输

  • 客户端:新增 WS / WSS 两种协议号,升级路径 /api/ws,握手阶段设 15 秒收发超时(对端接受 TCP 却不回数据时不会让重连循环永久停摆),单帧上限 256 MB,帧掩码由通道私有 PRNG 在发送锁内生成
  • 服务端:Go 与 MFC 两套实现都在设备端口嗅探 WebSocket 升级请求,旧客户端与旧配置不受影响
  • 远程协议切换:在线列表右键新增「协议切换」,三个单选项取自连接的真实传输;切换时把入口与(WSS 需要的)反代信任锚下发给客户端,客户端落盘后重连,五分钟内未成功登录自动回退

抓屏与 Web 端

  • 旋转显示器:DXGI 在旋转输出上报的是逻辑尺寸、返回的却是未旋转的横向位图,尺寸不匹配时 CopyResource 静默不拷贝,首屏与每一帧都是全黑——改为按真实纹理描述分配并按 Rotation 直立图像
  • 无帧自动回退:虚拟 / 无头显示、Session 0 与不推送复制通知的驱动会让 AcquireNextFrame 永远超时,现在首屏取不到就整段会话改用 GDI,画面不会停在「请稍候」
  • 无交互桌面:工作站锁定或会话已断开时,DXGI 初始化在部分驱动上会永久卡住,主控连窗口都打不开;现在建采集器之前就判定并选 GDI
  • Web 光标:非控制模式下也能看到真实远端光标(形状变化立即下发、位置最多 50 ms 一次)
  • iOS 幽灵竖线:画布改为固定铺满容器、每帧 ctx.setTransform 绘制,图层不再移动,也就没有可缓存的陈旧边缘
  • 竖屏输入法错位:光标覆盖层改为与画布同包含块、坐标用画布内 CSS 像素,祖先怎么平移两者一起动;输入条固定在画面下沿,不再逐帧追随键盘高度

Linux / macOS 客户端

  • MCP 一级工具(进程终止、命令执行、持久终端、远程控制、剪贴板)开始接受 Linux 主机,命令白名单按平台分开
  • 上传 / 下载与主机间直传支持 POSIX 路径;Linux 目标会上报落盘回执,服务端的 receiver_ack 因此有了真实含义
  • Linux 远程升级落地:校验长度、ELF 魔数、架构与 MD5 后写临时文件、原子 rename、保留 .old、fork 后 execv,任何一步失败都保持旧版本运行
  • 屏幕预览开始应答(客户端发原始像素、服务端统一转 JPEG,避开 libjpeg ABI 问题);桌面 / 下载 / 主目录快捷方式按 user-dirs.dirs 展开

其他修复

  • 主控重启后客户端重连空转,一秒 919 行重复日志把环形缓冲整个冲掉
  • 右键菜单作用于错误主机(虚拟列表行号在菜单打开期间被排序或下线挪动)
  • 加壳客户端收不到即时消息、远程交谈对话框创建失败(资源段为空),改用内嵌模板
  • 键盘记录钩子饿死快捷键转发;锁定聊天时 Win 键不转发
  • 聊天消息以 e 开头被丢弃(首字节与心跳令牌相同)
  • 文件搜索在深目录栈溢出;空目录下载超时;连接列表地址显示反序
  • macOS 合盖外接屏的鼠标偏移

升级提示

  • MCP:新增六个开关(主机管理 / 危险主机操作 / 远程交谈 / 文件写入 / 键盘记录 / HTTPS),均默认关闭;开启后建议重连一次连接器,部分客户端会缓存上一次的 inputSchema
  • WebSocket:nginx 侧需要一个 location /api/ws(Upgrade / Connection 头),完整配置见仓库 docs/WebSocket_Transport_Design.md;WSS 的反代证书必须能被客户端的信任锚验证
  • 远程协议切换只对声明了对应能力位的新客户端生效,旧客户端下整组菜单项置灰
  • Linux 客户端:需要新版 ghost 才能用 MCP 一级工具、文件传输与屏幕预览