>_ssh-agent-mcpv0.1.0
⌘ K
GitHub ↗

VERIFICATION

全面功能测试报告

2026-11-02:服务日志自动保留

完整回归 490 项通过,0 失败、0 跳过;文档构建及链接检查通过。新增 ssh_session_log_cleanup(scope="services"),默认预览,按 30 天/64 MiB 保留已停止服务的日志。新服务启动时和 shared worker 每运行 6 小时自动执行;当前写入者、启动锁、无法确认归属的记录和符号链接均不删除。删除时与服务启动共用逐实例锁,重新检查 PID 与文件身份;预览返回 reclaimableBytes,实际删除返回 freedBytes。

回归验证年龄/容量筛选、活动日志优先计入容量、无效元数据与启动锁保护、符号链接目录拒绝,以及工具按 scope 采用正确默认值(exec 为 7 天,services/sessions 为 30 天)。本机只读预览时服务日志约 139 KB,未命中过期或容量阈值,因此没有删除历史日志。

范围:此轮新增的是本地 shared service 日志清理,不截断活动日志、不删除活动历史、持久终端记录、远端 job 或续传临时文件。exec 仍在完整日志写入后触发自动清理;终端日志仍需调用清理工具。64 MiB 是保留目标,活动日志受保护时可以超出。

2026-11-01:版本漂移、SFTP 超时与多目标超时修复

本轮针对真实验收中发现的三个 P0/P1 问题完成修复并验证:共享服务按配置作用域回收旧 build;SFTP 对已知文件大小按保守带宽预算自动延长超时,且超时只关闭 SFTP 通道;ssh_exec_many 为每个目标同时设置命令和连接超时。上传/下载新增 timeoutMs,远端文件独占创建新增 REMOTE_FILE_EXISTS,文档和工具参考已同步。

  • 完整 npm test:487 项通过,0 失败,0 跳过;构建、工具参考生成和站点链接检查通过。
  • 阿里云 aliyun-server 真实连接:诊断和 SFTP 通过;脚本原样 stdin、上传/下载往返、SHA-256 校验、远端清理通过。
  • ssh_exec_many 实测 aliyun-server + 不可达 server-2,perTargetTimeoutMs=2000 在约 2 秒返回:阿里云成功,不可达目标返回 SSH_CONNECTION_TIMEOUT,不再等待默认 30 秒。
  • 已停止旧 shared service 并由当前 build 重新启动;服务状态只保留当前实例。

本轮没有触碰生产服务、Docker、数据库或防火墙;测试文件写入 /tmp 临时路径并已清理。大文件吞吐未作改动,仍由 fastGet/fastPut 和实例公网带宽决定。

2026-10-31:阿里云真实主机验收

使用当前 origin/main 的构建连接 aliyun-server,所有写入限定在 /tmp/ssh-agent-eval.jAXGyf 随机临时目录,结束后已核对删除;本地上传/下载文件也已清理。

  • 连接诊断、SFTP、OpenSSH 收尾诊断、脚本 stdin 原样投递、JSON/引号、Python、步骤失败即停、输出预算和 sudo -n 均通过。
  • 原子文件编辑的 inode 替换、inPlace 的 inode/硬链接保持、缩短文件、私有备份和权限均通过。
  • 后台任务完成/轮询、resourceKey 冲突退出 75、1 MiB 上传下载逐字节摘要一致、同机 SFTP relay、显式目标的 ssh_exec_many 失败隔离均通过。
  • 持久终端创建、cwd、游标读取、resize、停止和日志保留通过;读取必须把上次返回的 nextOffsetChars 传给下一次 ssh_session_read,从 0 重读只会再次看到欢迎信息。
  • 本机配置的阿里云主机以 root 登录,sudo -n 可用;远端存在 Python、Docker、flock、base64、sha256sum,未安装 rsync,因此 rsync 引擎不适合作为该主机的默认同步方式,应选择 SFTP。
  • 本轮没有修改生产服务、防火墙、Docker Compose 或持久配置;端口转发仅短暂转发远端 127.0.0.1:22 并已停止。

结论:当前构建满足这组真实运维路径;后续使用阿里云时优先 ssh_sync(engine="sftp"),长驻终端按游标增量读取,配置文件 bind mount 使用 writeMode="inPlace"。本轮没有留下未解决的代码级失败。

2026-10-30:输出脱敏、inode 保留、收尾诊断与多机执行

完整回归 486 项通过,0 失败、0 跳过;工具增加为 33 个,ssh2/OpenSSH 两种后端通过真实 MCP stdio 逐一调用。

  • 管理员配置 redactLocalFiles / redactEnv,在返回、活动输出、完整 exec 日志和终端日志写入前脱敏。验证 JSON 转义、跨块、长前缀、文件/任务跨页、配置加载失败,以及含已声明值的文件禁止整文件回写。
  • writeMode: inPlace 要求预览哈希并强制私有备份;验证 inode/硬链接不变、缩短和清空正确、默认原子模式仍替换 inode,以及注入截短失败时保留备份并明确报告可能部分写入。
  • 原生 exec 的共享连接收尾行移到 transportDiagnostics;保留其他 stderr、UTF-8 和未换行进度。回归中发现并修复了按行缓冲延迟步骤协议事件的问题。
  • ssh_exec_many 验证重复目标/并发上限、顺序、总预算分配、部分失败隔离以及缺省连接拒绝。失败不触发自动重试。

阿里云当前构建的独立 MCP 实例 6 / 6 场景通过:本机 SSH 端点与阿里云聚合执行、正常收尾诊断、已打开描述符观察原地修改及备份权限、stdout/stderr/完整日志/文件分页脱敏、后台任务分页脱敏、durable worker 的日志落盘前脱敏。仅使用临时目录和生成的测试值,临时目录与测试 worker 已清理,结果位于忽略目录 output/improvements-validation/result.json。inode 行为验证使用已打开描述符及本机硬链接,没有创建 Docker 容器或改动生产配置。

既有共享服务未替换;部署需要重启该服务,既有持久终端需要重新创建以加载新的日志脱敏实现。

2026-10-30:资源锁、日志保留与续传

npm test:479 项通过,0 失败、0 跳过。阿里云独立实例 5 / 5 场景通过,续传复用 65,536 字节并核对最终摘要。

新增远端账户级 resourceKey 协作锁,供 exec/job 共享,要求 flock;冲突非阻塞退出 75。完整 exec 日志在新日志写入后自动按 7 天/512 MiB 保留策略清理,保护当前输出;原清理工具增加 scope=exec 和预览。跨机传输增加 resumable/transferId,校验已传前缀后追加,并校验最终摘要;同服务同目标拒绝并发传输。

本机新增日志年龄/容量/预览/符号链接检查、锁输入校验及两种 SSH 后端的前缀复用、错误前缀拒绝、符号链接拒绝与中断 ID 回归。阿里云验证同步执行与后台任务同锁互斥、完成后释放,以及中断后重启 MCP 再续传,测试记录位于忽略目录 output/recovery-validation/。远端及本机临时夹具已清理。协作锁与续传的账户、路径别名、其他写入者和结果未知等边界已补充到使用文档。

2026-10-30:真实运维工作流优化

npm test:475 项通过,0 失败、0 跳过。文档构建及链接检查通过,工具增加为 32 个,两种 SSH 后端经真实 MCP 客户端逐一调用。

  • 多连接 MCP 请求必须明确 connectionName;缺失或未知目标在连接前拒绝,返回可选名称。单连接仍可省略。网页单连接 POST 同步采用明确目标规则;拒绝请求也写入活动记录。
  • ssh_exec 结构化结果增加实际连接名与失败阶段;阶段按执行流程记录,区分参数检查、准备、连接、打开通道、执行。错误对象只提取诊断字段,不再直接转换成 [object Object],不序列化其中的请求或凭据对象。
  • ssh_job_start 支持 bash/sh/python3 多行脚本、环境变量与 shell failFast。新任务以私有目录和文件落盘,目录冲突拒绝覆盖;启动结果不确定时保留任务 ID,指导先查状态。start/status 返回结构化字段与 outputSchema;真实状态不从任务日志中的状态文字推断。
  • 新增 ssh_file_transfer:两端 SFTP 流式中转、SHA-256 目标回读校验、原子发布、默认拒绝覆盖。无本地中转文件或文件内容工具输出。路径限制与受限动作策略均有效;超时及校验失败保持原目标,临时文件尽力清理。
  • 新增 15 项回归,覆盖多主机拒绝、错误对象、未知启动结果、断线后的 Python 任务、shell failFast、35 MiB 二进制传输、覆盖策略、超时/损坏注入、符号链接越界与受限连接。

阿里云独立 MCP 实例实测 6 / 6 场景通过:多主机缺参拒绝、Python 后台任务、MCP 进程重启后任务恢复、35 MiB 本机 SSH 端点→阿里云、35 MiB 反向回传逐字节一致、已有目标不被覆盖。测试仅使用本次临时目录,远端及本机夹具均已清理;结果位于忽略目录 output/operations-validation/result.json。

本轮集中完成目标选择、长任务、诊断和跨机传输。资源级并发锁、自动日志容量管理、后台/断点续传尚未加入;同步传输仍受客户端及 SFTP 超时约束。任务后台化不等于业务幂等,未知结果不会自动重试。

2026-10-28:结构化结果与策略竞态 debug

先补回归并确认修复前失败,再修复以下四类问题:

  1. SSH 通道关闭却未返回退出码/信号时,原实现将其视作成功完成。现返回工具错误,保持 exitCode: null、completed: false,并保留已收到的输出;同时规整后端可能传入的 null 状态。
  2. 通道发生流错误时,原实现丢弃此前 stdout/stderr。现保留已捕获内容,继续执行输出预算和完整捕获日志保存,并关闭故障通道。
  3. 固定动作没有 stdin 输入入口,却未发送 EOF,读 stdin 的程序会等待直到超时。现立即关闭动作 stdin,ssh2/OpenSSH 两种后端的固定 /bin/cat 动作均正常空输入退出。
  4. 命令通过策略校验后,异步连接准备或共享 shell 排队期间可能发生配置重载,旧命令仍可下发。现准备完成及出队时复核配置,变化则在执行前拒绝;内容相同的配置重载仍可继续。

npm test:460 项通过,0 失败、0 跳过。新增 5 项异常/竞态回归和 2 项真实 SSH stdin EOF 回归。文档同步说明未知完成状态、故障输出和策略重载语义。

阿里云当前构建的独立 MCP 实例 31 / 31 项通过,包括新增固定动作 stdin EOF 验证及原有结构化结果/受限入口检查;网络中断和配置竞态通过可控事件测试复现,未人为中断生产服务器。结果保留在忽略目录 output/aliyun-debug-validation/;远端及本机测试临时目录已清理。现有共享 MCP 服务未替换,需重新连接加载构建。

2026-10-28:结构化执行结果与固定动作策略

npm test:453 项通过,0 失败、0 跳过。本机隔离 sshd 对 ssh2/OpenSSH 两种后端验证执行结果;阿里云当前构建的独立 MCP stdio 实例 30 / 30 项通过,远端及本机测试临时目录均已清理。

  • ssh_exec 发布 outputSchema,在 structuredContent 返回实际退出码、信号、执行/完成状态、超时、捕获硬上限、返回截断、完整捕获路径、落盘错误和每步状态;保留原文本和非零退出语义。
  • 测试覆盖并发结果隔离、正文伪造退出/步骤标记、任意字节边界的事件解析、1 字节预算、失败即停/继续、显式 exit/exec、超时的未知状态、完整日志及磁盘故障。输出完整日志不包含工具内部步骤事件。
  • 可选 executionPolicy.mode: "actions-only" 只运行管理员定义的绝对程序路径与固定字面量参数;拒绝执行参数覆盖。关闭任意命令、脚本、任务、文件传输/同步、终端和转发入口。验证发生在服务层;配置错误拒绝加载,失败重载保留现有策略。
  • 阿里云实测 MCP schema、结构化字段、步骤状态、并发、超时/截断、固定动作、动作目录、参数覆盖拒绝,以及 SFTP、上传/下载、两种同步、后台任务、持久终端和正反向转发的拒绝结果。只运行身份读取、打印和测试临时目录操作,没有修改服务器服务或防火墙。
  • 固定动作策略属于 MCP 能力限制,不是远端系统沙箱。文档明确低权限账户、可信动作文件、其他连接/直接 SSH、已有后台进程和秘密主动输出等边界。

新增权限检查后补全旧文件同步和会话清理测试夹具的连接配置;最终全量回归通过。验证脚本和不含凭据的结果位于忽略目录 output/aliyun-structured-validation/。本次只构建并运行独立实例,现有共享 MCP 会话需重新连接以加载新接口;生产连接未自动启用受限策略。

2026-10-28:Python stdin 原样执行与阿里云复验

npm test:438 项通过,0 失败、0 跳过。阿里云当前构建的独立 MCP stdio 实例实测 34 / 34 项通过,覆盖原有 25 项及 9 项 Python 验证,远端和本机临时目录均已清理。

ssh_exec 新增 interpreter: "python3",使用 python3 -u - 原样接收 stdin 源码并及时返回输出。解释器调用串统一用于命令过滤和执行;Python 与 steps / failFast 的无效组合在连接前拒绝。远端需自备 Python,不安装依赖,也不创建远端脚本文件。

  • test/fixtures/python-stdin.py 是 58 行真实执行样例:含 JSON 嵌套对象、中文、单双引号、反斜杠和 shell 字面量,并在内存 SQLite 中执行带 'stream' / 'non-stream' 的 SQL。ssh2/OpenSSH 本机实测及阿里云均保持原值,源码标识为 <stdin>。
  • 验证未捕获异常及语法错误、显式退出码、UTF-8 输出预算、缺少解释器时的非零退出,以及 Python 在超时前输出的进度能被保留。
  • 验证 cwd、普通环境变量和仅在远端读取的随机测试密钥,以及真实 sudo 包装;阿里云登录本身仍为 root,不代表普通账户提权授权验证。
  • 验证实际 python3 -u - 调用及脚本正文接受命令过滤规则,更新完整 MCP 调用链测试、工具 schema 和使用示例。

逐项阿里云结果和可重跑脚本保留在忽略目录 output/aliyun-python-validation/。未重启或替换已有共享 MCP 服务。

2026-10-28:阿里云服务器真实连接验收

通过当前构建的独立 MCP stdio 实例,使用已有 aliyun-server 连接配置和原生 OpenSSH 后端连接真实阿里云服务器,25 / 25 项通过。实际登录为 Linux root,sudo -n 可用;验证了真实 sudo 包装执行,未覆盖普通账户到 root 的授权规则。

  • 多行 bash/sh 脚本、中文与嵌套引号、SQL heredoc;失败即停及 bash pipefail。
  • 批量步骤保留目录和变量,失败步骤停止后续写入;继续模式保留第一个失败状态。
  • 真实 sudo 下的 cwd、环境变量、stdin,以及仅在远端生成和读取的随机测试密钥;密钥值未返回测试客户端或对话。读取失败终止命令,越出允许目录的符号链接被拒绝。
  • UTF-8 安全截断与 0600 完整日志;默认 64 KiB 返回预算保留 70,000 字节完整捕获;极小预算保留退出码,超时及 1 MiB 测试硬上限均返回正确错误。
  • 256 KiB 二进制通过 ssh_upload 传输,远端 SHA-256 与本地一致,文件内容不进入 MCP 参数。
  • 本机输出目录不可写时,真实远端成功/失败结果仍保留;白名单/黑名单阻止环境和 sudo 参数绕过;配置重载、超时及输出硬上限之后恢复正常执行。

所有写入位于本次创建的远端 /tmp/ssh-agent-mcp-check.* 目录;结束时删除该目录并用远端命令确认不存在。本机临时状态和上传夹具也已删除。验收脚本和不含凭据的逐项结果保留在忽略目录 output/aliyun-exec-validation/,未重启或替换已有共享 MCP 服务。

首轮测试中,普通 PTY 命令返回了 OpenSSH 的 Shared connection ... closed 标准错误提示;测试按工具现有的 stdout / [stderr] 分段核对实际输出后,完整复测通过。未因此修改生产代码或丢弃 stderr。

2026-10-28:部署执行能力与输出预算回归

npm test:431 项通过,0 失败、0 跳过。npm run docs:build 与 npm run docs:check 通过;使用文档的 19 个 JSON 示例可解析,多行 shell 示例实际执行通过。

  • 修复 env / sudo 在原始命令校验后改变执行语义的问题:配置命令白名单或黑名单时拒绝环境注入和提权;白名单连接拒绝脚本和步骤。
  • 输出预算在执行前校验;MCP 默认返回最多 64 KiB 正文,退出码、信号和超时/硬上限提示独立保留。UTF-8 头尾截断与完整捕获日志权限经过验证;本机落盘失败不覆盖已经完成的远端执行结果。
  • script 通过 stdin 原样传递,支持 bash/sh;failFast 开启 errexit,bash 同时开启 pipefail。steps 在同一 shell 中保留目录与变量,输出步骤编号及状态,默认失败即停,可选择继续并保留失败结果。
  • envFromRemoteFiles 仅在远端读取值,校验变量名、参数冲突、绝对路径与已配置的符号链接范围;调用结果、活动事件及历史中未出现测试秘密。此验证不等同于自动脱敏,用户命令主动打印秘密仍会进入输出。
  • 使用隔离的本机 sshd,在 ssh2/OpenSSH 两种后端实测,另外经过真实 MCP stdio 调用新参数。sudo 使用模拟入口验证 -n -- 参数、cwd/env/stdin 和拒绝执行路径,没有修改测试账户的 sudo 权限,也没有执行本机提权。
  • 补充大文件直接使用 ssh_upload 的说明,更新自动生成的工具参考。持久终端的单条命令输出区间封装未在本轮加入。

新增测试的临时密钥文件使用独立后缀,避免影响原有文本文件 glob 断言。SSH fixture 清理对 OpenSSH 异步退出期间的目录写入增加有限重试;最终全量回归通过。

2026-10-27:历史写盘失败恢复与关闭清理

npm test:403 项通过,0 失败、0 跳过。

修复临时写盘失败后清除待保存状态的问题。失败记录保留在内存,最多每秒自动重试一次,不依赖后续新操作触发;恢复成功后推送恢复事件,网页同步清除存储错误提示。

关闭日志时执行最后一次保存尝试,取消重试定时器;重复关闭不再重复发出关闭事件。持续磁盘故障下仍不能保证未保存记录跨进程恢复。

新增四项回归:无新操作时自动恢复、关闭前最终保存、持续故障后关闭停止重试,以及暂停显示时清除已恢复的存储提示。修复前前两项均复现失败。

2026-10-27:执行结果与操作记录状态一致性

npm test:399 项通过,0 失败、0 跳过。

操作记录不再扫描输出中的 [exit code] 或 [signal] 来判断失败。命令执行工具在捕获实际执行失败时,将失败状态写入当前请求上下文;并发请求独立记录,MCP 原有文本返回格式保持不变。

回归覆盖两种后端的 exec/shell 模式:成功命令输出失败标记、失败命令先输出成功标记,以及读取包含这些标记的文件。修复前两种后端均复现误判,修复后通过。

2026-10-27:操作记录重启恢复与会话实例隔离

npm test:396 项通过,0 失败、0 跳过。

  • 未完成的终端读写等普通请求在服务重启后标记为中断,补上结束时间,并将修正状态写回历史文件。
  • 持久终端输出按配置、PID 和启动时间绑定实例。同名重建时结束旧记录并建立新记录;读取过程中发生替换也不会将新输出写入旧记录。
  • 旧版历史没有实例标识时停止自动跟踪;再次确保会话或发送输入会为当前实例建立新的输出记录。
  • 新增两项回归,覆盖重启修正持久化、同名重建、重复观察去重、读取中途替换和旧版历史处理。

2026-10-27:同名终端重建与输出恢复

npm test:394 项通过,0 失败、0 跳过;另有 8 条真实浏览器交互检查通过。

修复同名持久终端更换 worker 后沿用旧输出偏移量的问题:网页按会话名、PID 和启动时间识别实际会话,重新读取新输出、清空旧输入并回到只读状态。旧会话对象和晚到的读取结果不会覆盖新会话。终端读取失败时重新查询会话列表,避免反复读取旧偏移量而跳过状态刷新。

新增会话对象替换回归,以及 ssh2/OpenSSH 下停止后立即同名重建、PID 更新和新输出读取的真实 HTTP 测试。浏览器延迟测试新增同名重建后的输出重置与输入隔离检查。

2026-10-27:转发生命周期与网页焦点回归

npm test:391 项通过,0 失败、0 跳过;另有 6 条真实浏览器交互检查通过。

  • 修复本地/远端转发在关闭或断线期间迟到注册的问题,回收迟到分配的端口和本地监听器。
  • 反向转发等待分配最长 10 秒;超时、断线后迟到的成功响应会取消对应转发。
  • 创建中的转发计入各方向 32 条上限,失败或完成时释放预留名额。
  • 网页服务器按钮和终端标签在自动刷新时复用节点,保留键盘焦点和正在进行的点击。

新增 8 条可控时序回归,覆盖创建中关闭、监听时断线、迟到回调、超时和并发数量限制。两种后端的真实 MCP 全工具测试也通过。浏览器隔离测试新增两条自动刷新焦点检查。

2026-10-27:工作台离线刷新与异步编辑回归

npm test:383 项通过,0 失败、0 跳过;另有 4 条真实浏览器延迟交互检查通过。

修复任务页在未连接或服务重启后自动建立 SSH 连接的问题;历史任务跟踪等待显式连接后恢复。切换服务器/终端会清空未发送命令,防止将旧命令带到其他目标。文件读取和备份恢复期间输入的新草稿不再被晚到的结果覆盖。

使用真实 ssh2/OpenSSH 测试离线任务接口;重建活动监视器验证离线历史任务不会自动连接。浏览器通过独立上下文和延迟 API 响应验证四条交互回归,全部通过,不操作实际服务器文件。

2026-10-27:按服务器断开连接

新增 ssh_server_disconnect 和网页顶部“断开连接”。所选服务器的共享 SSH、持久终端、本地与远端转发关闭,其他服务器保留;远端后台任务继续运行,自动任务轮询暂停,下一次显式 SSH 操作可重连。

  • npm test:380 项通过,0 失败、0 跳过。
  • ssh2/OpenSSH 通过真实 MCP 与 HTTP 验证资源隔离、幂等断开、未知服务器拒绝、任务存活、禁止自动重连、显式重连和终端启动并发保护。
  • 两种后端的全工具测试扩展为 31 个工具。
  • 阿里云实测:网页按钮关闭专用测试终端和转发,任务页保持暂停刷新,显式命令重连后 MCP 再次断开成功。测试资源已关闭。

2026-10-27:MCP 并发、参数与文件边界复查

完整自动回归 372 项通过,0 失败、0 跳过。新增 mcp-regressions.test.js,ssh2/OpenSSH 共 12 项(含父测试),通过真实 MCP HTTP 客户端与临时 sshd 验证请求边界。

本轮先复现再修复:

  1. 每个 HTTP 请求创建的文件编辑器持有独立锁,两个请求可能同时通过同一哈希预览并返回成功。编辑锁改为同一连接管理器共享,并按实际路径与有效连接名定位;默认名省略和符号链接别名也归到同一锁。测试在 rename 前延迟,稳定复现竞态;修复后只有一个提交成功,另一个返回版本冲突。
  2. 终端创建时省略连接名、复用时填写默认连接名,被误判为不同服务器。新会话保存有效连接名,并兼容旧元数据中省略的默认名称。
  3. 字节读取及覆盖/追加写入只校验字面路径,可通过符号链接访问允许目录外的文件。SFTP 读取、写入、上传、下载与目录传输加入实际路径校验;新目标检查父目录,拒绝无法安全解析的悬空链接,保留 REMOTE_PATH_NOT_ALLOWED 错误码。
  4. 停止转发只有 forwardId,操作记录错误回退到默认服务器。MCP 和网页入口现在先查转发归属,再执行停止并记录。

经用户授权,另通过 两个真实 stdio MCP 客户端连接阿里云,在同一本机共享服务内验证:30 个工具发现、无效参数/未知工具/未知连接拒绝、并发结果隔离、非零退出、超时后恢复、独占文件创建、UTF-8 读取、追加、参数组合校验、并发编辑冲突、二进制上传下载 SHA-256 校验、跨客户端持久终端复用/输入/读取、错误服务器复用拒绝、真实 TCP 转发及跨客户端停止。测试创建的远端临时目录、转发和终端均已清理;没有修改用户业务文件。

文件编辑锁仅协调同一服务内的编辑请求;远端其他进程仍可能并发修改文件。SFTP 实际路径校验不替代远端账户权限或操作系统沙箱,也不保证抵御校验后远端目录被其他进程更换的竞态。

2026-10-27:真实阿里云网页调试

经用户授权,连接导入的阿里云主机(原生 OpenSSH 后端),通过浏览器和真实 MCP 客户端交叉验证。远端文件仅在独立临时目录中创建和修改;本轮任务、会话、转发单独追踪并清理。

  • 完整自动回归 360 项通过,0 失败、0 跳过;含新增终端缓冲/控制序列/任务状态解析,以及两种后端的默认目录解析和路径限制回归。
  • 修复终端超过 64 KiB 后反复读取旧窗口、后续输出不显示的问题。阿里云先输出超过 80,000 字符,再追加标记,网页能够继续显示。
  • 修复刷新丢失服务器、目录、会话选择;保留显示名称;重命名输入不再被定时刷新打断。
  • 修复文件管理首次请求 . 被绝对路径校验拒绝;通过 SFTP 解析主目录,保留允许路径校验。
  • 后台任务显示独立状态行、退出码和停止按钮;MCP 创建任务/转发后无需手动刷新网页,网页停止操作已实测。转发实际传输阿里云 SSH 握手数据。
  • 浏览器完成文本预览、写入、备份恢复、空文件读取、UTF-8 上传;外部并发修改后拒绝覆盖,草稿保留。
  • 命令执行期间网页显示第一段输出,结束后状态转为完成;操作记录按服务器/来源/失败筛选及文件差异查看通过。
  • 连接诊断、重新连接、停止持久会话通过;修复空会话列表异常和停止按钮被重新启用的问题,关闭最后一个会话后清空终端并禁用相关控件。
  • 凭据过期改为页面内提示;同地址 Token 片段更新也会被接收,重新打开启动链接可恢复访问,地址中的 Token 随即移除。
  • 1440 像素桌面及 390 像素手机布局已检查;终端、文件、任务、转发和操作记录没有页面横向溢出。

版本冲突与失效凭据测试会产生预期的 HTTP 400/401。以上是本轮实际覆盖范围,并不代表所有网络故障、终端交互程序或远端操作系统都已经验证。

2026-10-26:操作记录界面重构

  • 全量测试 353 项通过,0 失败,0 跳过。
  • 修复无参数工具将 MCP 请求上下文记作参数的问题;服务器列表使用全局范围,历史记录兼容清理。
  • 页面采用操作列表和详情双栏;中文名称、结构化服务器结果、独立参数/差异标签、文件差异着色、统计筛选、侧栏服务器搜索。
  • 浏览器验证:中文搜索、状态筛选、暂停时持续收集、详情标签键盘切换、搜索快捷键,以及 390/352 像素宽度下所有页面无横向溢出。

2026-10-26:自动接入共享服务

  • 完整回归:350 项通过,0 失败,0 跳过。
  • 两个真实 stdio MCP 客户端并发启动,只创建一个共享服务;30 个工具可调用,命令结果和活动记录汇总。
  • 验证端口占用自动避让、UI 启动复用、客户端退出后后台存活、权限配置隔离。
  • 验证私有注册文件、鉴权管理端点、陈旧锁恢复、服务崩溃恢复;失败操作不会重放。
  • 一键 Codex 注册保留其他 MCP 配置、先备份、可重复运行,拒绝覆盖无关同名条目。

2026-10-26:实时操作记录

检查 结果
完整构建与 npm test 340 项通过,0 失败,0 跳过
操作记录单元测试 4 项:并发隔离、脱敏、保留上限/重启和磁盘失败
实际 MCP HTTP + SSH ssh2 / OpenSSH 共 16 项(含父测试):鉴权 SSE、exec/shell 传输在结束前收到命令输出、非零退出、文件差异、拒绝操作、任务/终端自动跟踪、网页操作和重启恢复
浏览器 实时出现、状态筛选、差异搜索、暂停期间仍记录、重连补回历史通过;352 像素宽度无横向溢出

额外修复了 zsh 交互 shell 的标记回显误判:禁用行编辑器回显,并转义命令起止标记;真实 ssh2/OpenSSH shell 流式回归及原有连接管理测试通过。

正常浏览器流程无脚本错误;主动中断 SSE 的重连测试会产生预期网络错误。测试使用隔离临时 sshd 和状态目录。自动跟踪只覆盖此服务启动或接触并纳入跟踪的任务/会话,不证明对其他进程或服务器全部操作的可见性。历史有数量和输出大小上限;不属于不可篡改审计。

2026-10-26:网页端与全项目回归

环境:macOS,Node.js 25.8.1,真实本机 sshd;浏览器为 Playwright Chromium。

检查 结果
TypeScript 构建与完整 npm test 320 项通过,0 失败,0 跳过
新增网页端真实 SSH 回归 ssh2 / OpenSSH 共 16 项(含 2 个父测试)通过
HTTP / CLI 回归 UI 鉴权、恶意 Host、跨站 Origin、非 JSON 写请求、规范 URL、自定义路径及端点冲突均通过
浏览器功能检查 中文终端命令与自动输出、真实诊断、文件编辑/保存/恢复、子目录上传、跨主机状态清理、任务停止、转发停止通过
小屏检查 352 × 800 下五个页面无横向溢出
Token 登录 首次匿名 API 请求返回预期 401;输入 Token 后可读取主机列表
浏览器错误 常规流程无控制台错误;Token 流程仅有预期的首次 401,无脚本异常
npm audit 本轮 0 个已知漏洞
文档站与分发包 11 个页面、314 个本地链接/资源有效;npm 包包含全部 4 个网页静态文件

修复内容

  1. 修复终端 GET 读取地址与路由不一致,增加输出刷新、唯一会话名称和停止按钮;切换主机重置会话与输入状态。
  2. 修复上传控件在应用根节点之外导致事件绑定失败;使用真实当前目录,避免上传到示例路径或已打开文件之下。
  3. 文件编辑改为完整、严格 UTF-8 读取,保留行首数字、制表符和 BOM;拒绝截断文件及非法编码,校验解析后的路径和符号链接目标。
  4. 预览和保存使用文件哈希;拒绝旧版本覆盖,支持空文件、私有备份与恢复。浏览器中切换文件/主机前提示未保存修改。
  5. 用真实后端实现诊断、重连和配置重载;显示真实后端和配置来源。输入按钮明确为共享输入,显示名称仅为浏览器别名。
  6. 任务页面补齐停止操作;转发按主机过滤并显示两端地址。增加刷新操作。
  7. UI API 补齐 Host/Origin/请求方法/JSON 类型和参数校验;修改请求不再接受 GET。无尾斜杠地址跳转到规范地址,自定义 UI 前缀不能覆盖 MCP 端点。
  8. 修复 SFTP 文本读取到 EOF 后、流句柄尚未关闭即结束通道的竞态;等待整个流清理完成,再关闭 SFTP。

范围与复现

真实 SSH 测试使用临时密钥、临时 sshd、临时文件和隔离的任务/会话目录,没有连接个人服务器。原有测试同时覆盖全部 30 个 MCP 工具、两种后端、OpenSSH 复杂配置、传输、认证、tmux、任务及双向转发。

网页端提供输出观察和命令输入,不是完整终端模拟器;不保证独占输入。文本编辑/上传上限为 4 MiB,二进制传输、任务创建和转发创建使用 MCP 工具。没有实测 Windows、所有远端系统或生产堡垒机组合;没有做吞吐压力基准。

npm test
node --test test/web-ui-live.test.js test/http-transport.test.js test/command-line-parser.test.js
npm audit

上一轮记录:2026-10-25

日期:2026-10-25。环境:本机 macOS,Node.js 25.8.1;新增的真实集成测试另在 Node.js 24.18.0 下复测。

结果

检查 结果
TypeScript 构建与完整 npm test 301 项通过,0 失败,0 跳过
ssh2 / OpenSSH 的 MCP 工具实测 两种后端分别调用全部 30 个工具,均通过
Node.js 24 兼容性复测 本轮 19 项文件编辑、全工具集成与 tmux 测试通过
依赖检查 npm audit 0 个已知漏洞;仅代表此次审计结果
npm 包安装与启动 50 个分发文件;临时目录全新离线安装、MCP 初始化发现 30 个工具、本机 PTY 实际启动并返回正确尺寸
进程清理 测试完成后未发现遗留的测试 session worker、OpenSSH control 连接或测试 sshd
tmux 3.8 真实观察窗口 两种后端共 4 项测试通过:中文输出、pane 复用、手动停止、autoClose 清理
原始仓库 两个原始参考仓库均无修改

发现并修复的问题

  1. 原生转发通道销毁未终止 SSH 子进程。 为原生进程通道补充销毁处理,并处理 stdin 错误;回归测试确认关闭后子进程退出。

  2. 终端自然退出后重开同名会话遗留旧 worker。 重开前先停止旧 worker;测试确认新会话使用新 PID、原 PID 退出。

  3. SSH 断线时反向转发清理抛出 Not connected。 清理允许连接已关闭的情况,并移除转发的 close 监听器,避免重复启停积累监听器;真实断线测试通过。

  4. autoClose 退出时观察窗口遗留。 worker 退出前读取包含观察窗口信息的最新元数据,关闭对应 tmux 会话并标记终端已关闭;两种后端的真实窗口回归通过。

终端 worker 的 IPC 通道同时使用 UTF-8 流式解码,避免 socket 分包时直接转字符串破坏中文字符。

实测覆盖

test/mcp-live-tools.test.js 使用真实 MCP stdio 客户端及临时 sshd,分别在 ssh2 / OpenSSH 上验证:

  • 服务器列表、命令工作目录与环境变量、中文输出、非零退出码、超时及超时后继续执行。
  • 文件独占创建、追加、按字节与按行读取、精确编辑、目录浏览、正则计数与 glob 查找。
  • 二进制嵌套目录上传下载及逐字节一致性。
  • rsync 预览、实际同步、目标删除、带空格路径,以及 SFTP 同步。
  • 受限路径访问返回错误。
  • 终端新建、复用、列表、输入、输出、停止与停止后的日志读取。
  • 后台任务启动、环境变量、完成状态与退出码、列表、停止。
  • 双向转发实际 TCP 数据往返、列表与停止。
  • 连接诊断、JSON 配置热加载及保留路径限制、重连后执行,以及会话日志清理 dry-run。

其他实际网络及回归测试覆盖:

  • 仅允许证书的认证、加密私钥、错误服务器公钥拒绝。
  • ProxyCommand、Match exec 在连接时执行;导入时不执行。
  • rsync 大文件小修改产生块级匹配数据。
  • 原 MCP 父进程退出后,新的进程复用同一终端且保留环境。
  • 文件原子编辑失败保留原文件、符号链接与路径校验、搜索截断与排除、病态正则超时恢复。
  • 连接管理、认证/代理逻辑、HTTP 鉴权与生命周期、CLI 导入和参数校验。
  • 热加载保留未变化的真实连接;旧连接的延迟 close 不清掉新连接;非法配置原子回退;OpenSSH 主机选择与 CLI 策略保留。
  • 诊断成功/失败均不返回配置中的凭据;日志按年龄与空间清理、默认预览、跳过存活 worker、锁和异常路径。

维护工具阶段新增 6 项回归;本轮另新增 5 项文件编辑回归,并将两种后端的全工具测试扩展至 30 个工具。停止终端的响应在元数据写入和 worker 清理后发送,避免调用方收到成功后临时目录仍被写入。

文件编辑覆盖预览无副作用、可应用 diff、哈希拒绝旧版本、私有备份、UTF-8 BOM/CRLF 保留、备份/原子替换失败与差异输出预算。两种后端均验证创建时远端尺寸为 25 行 90 列,resize 后为 42 行 132 列;同时拒绝非法尺寸和已停止会话。原生 OpenSSH 通过 node-pty 提供本机 PTY,安装脚本修复 macOS 预编译辅助程序权限;tmux 的 4 项回归再次通过。

范围说明

测试使用自动生成的临时密钥、仅监听 loopback 的临时 SSH 服务和临时文件。新增后台任务集成测试将远端 HOME 指向临时目录;未连接用户的真实服务器。

已通过 Homebrew 安装 tmux 3.8,并在隔离的 tmux server 中实测观察窗口(使用 capture-pane 验证实际中文显示)、窗口复用及手动/自动关闭。测试不使用个人 tmux 配置或已有会话。未实测 Windows、全部远端操作系统和生产堡垒机组合,也未做吞吐压力基准。认证/代理的部分组合由模拟测试覆盖,不能解读为每种组合均已通过真实网络验证。

复现

npm test
# 已构建后,只运行本轮新增的真实集成与回归测试
node --test test/mcp-live-tools.test.js test/auth-live-audit.test.js test/audit-regressions.test.js test/tmux-live.test.js
npm audit
npm pack --dry-run

真实 sshd 测试需要 ssh、ssh-keygen、rsync 和 sshd。默认 sshd 为 /usr/sbin/sshd,可用 SSH_AGENT_TEST_SSHD 指定其他路径。

tmux 观察集成测试还需要本机安装 tmux;macOS 可使用 brew install tmux。