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 一级工具、文件传输与屏幕预览