mcli 20261109:数据安全与自动化修复
mcli 20261109 已正式发布。 tag 为 RELEASE.2026-11-09T00-00-00Z,软件包版本为 20261109000000.0.0,源码提交为 e1d4cc5abfe0。本文记录相对 20261026 的变化。
这是独立 mcli 的维护版本,不会替换现有 Server 或 Console 构建中嵌入的客户端。正式维护和发布验收的服务端是 PGSTY SILO;对上游 MinIO 与其他 S3 兼容服务保持尽最大努力的兼容。
删除、搬移与下载
- dry-run 保持只读。
rm --purge --dry-run只预览指定前缀,不再执行删除。命名空间删除保护对所有命令行目标及每个 stdin 目标生效,不能再通过增加参数绕过--dangerous。 - 每个复制或搬移源使用自己的别名。 多源操作读取或删除后续对象时,不再错误复用第一个源的别名。
- 在复制或删除源之前拒绝已识别的自身搬移。 检查覆盖已解析的对象 URL、规范化的本地路径、符号链接和硬链接。端点保护还会拒绝桶与对象路径相同、协议和端口相同且 IP 重叠的搬移,包括
--resolve映射。 od按请求顺序下载分片。 不再重复最后一个分片,成功或失败时都会关闭已打开的 reader。非法参数、零分片大小、负数与算术溢出在修改目标之前报错;空复制不会再输出非法速率。
搬移保护采取保守策略:共享 IP 和端口的独立虚拟主机也可能被拒绝。先确认两端存储实际独立,才能分步复制、核验并显式删除;通过两个别名读到相同字节不能证明存储独立。不同 IP、端口、代理路由、虚拟主机寻址或 DNS 变化仍可能隐藏同一后端。同一存储的别名应使用一致的端点 URL。
对经 HTTP_PROXY 或 HTTPS_PROXY 访问的端点,本地 DNS 失败会将地址标记为未知,不再因此拒绝代理能够完成的搬移。代理选择遵循传输层的同一套规则,包括 NO_PROXY。已知自身搬移仍会被拒绝,无法解析的直连端点仍会失败。
脚本兼容性变化
部分失败与继续处理
复制或搬移的源准备失败、删除权限或 WORM 保护错误,以及 IAM 或桶元数据导入失败,现在保留详细错误并返回 退出码 1。这些路径此前可能错误返回成功。
cp 和 mv 在准备某个源失败后继续处理其他独立源,包括命令行中后续的参数。因此,部分失败的 mv 仍可能成功搬移并删除其他源。成功操作不会回滚。启动后续依赖任务前,应检查最终退出码和错误记录。
IAM 导入仅在服务端明确返回 NotImplemented 或 XMinioAdminVersionMismatch 时回退旧 API。其他 HTTP、传输或响应解码错误不会触发第二次导入。
JSON 进度
逐对象的 cp --json、mv --json 开始记录按派发顺序输出,totalCount、totalSize 分别表示累计准备好的对象数与字节数。它们会随源列举继续增长,不是最终任务总量,也不能作为完成百分比的分母。开始记录不代表传输完成,应检查最终退出码、错误记录与最终字节汇总。
复制计数器消除了数据竞态;取消时会收完工作线程的结果,同时保留有界的流式队列。
对象标签与属性
显式 --tags 现在对服务端和流式复制、搬移均生效,也适用于 --preserve;显式空值会清除标签。
非法 --attr 会使 cp、mv 在任何传输之前失败,不再静默丢弃所有请求的属性。cp、mv、mirror、pipe 会忽略空条目,因此允许末尾分号和连续分号:
缺少 = 的非空条目、未闭合引号,以及不含任何键值条目的输入(例如 ;)仍然报错。被引号包围的值中的分号仍属于值本身。
生成的上传命令
share upload 现在对完整参数使用 POSIX 单引号引用,并用 --form-string 按字面值上传策略字段。正确引用并替换占位符后,在 POSIX shell 中执行生成的命令。若命令保存在 upload 变量中,使用 sh -c "$upload";直接执行 $upload 只会做词拆分,不会解释其中的引号。Windows 上请使用 Git Bash 或 WSL,而不是 cmd.exe。
Batch 状态与诊断输出
Batch 状态增加暂停、完成但有跳过项的状态,以及暂停原因和跳过计数。优先采用完整的实时详情,包括明确的零值;定期及完成时刷新已保存的详情。无法确认终态完整详情时,输出 detailsUnavailable。
轮询已保存状态后,会继续观察健康的运行中或暂停任务。实时计数器不会丢失,已保存的终态会及时报告,指标流断开后的陈旧终态快照会被拒绝。
成功查询已完成、完成但有跳过项或失败的 batch 任务,命令仍返回 退出码 0。脚本必须检查任务状态和跳过计数,命令成功不等于任务成功。暂停不是终态,扩展详情需要服务端提供对应字段。
诊断输出还修复了 EiB 范围的 heal 进度、磁盘 I/O 首次采样被误作区间统计的问题,以及站点测速丢失小数时长的问题。
依赖版本
| 组件 | 选定版本 |
|---|---|
| Go | 1.27.3,保持不变 |
silo-pkg/v3 |
从 v3.15.2 升至 v3.16.0 |
上游 minio-go/v7 |
v7.4.2-0.20261025165926-320af050c445,保持不变 |
golang.org/x/net |
v0.62.0 |
golang.org/x/crypto |
v0.58.1-0.20261009181718-2f1f834330b2 |
klauspost/cpuid/v2 / YAML v3 |
v2.4.2 / v3.0.6 |
tidwall/gjson |
v1.20.1 |
SDK 与 x/crypto 选用的是固定的上游提交,不是对应的最终版本 tag。本版采用 networking、crypto 安全版本下限及 silo-pkg 3.16.0 更新。gjson 更新修复非法 emoji 输入之后的 UTF-8 字符保留。既有 systemd、终端字符宽度和 tablewriter 兼容性选择保持不变。
容器配置
容器定义预先创建带 sticky 位、可写的 /.mc,供没有 passwd 条目且收到 HOME=/ 的非 root UID 使用。root 仍使用 /root/.mc,--config-dir 和 MC_CONFIG_DIR 仍优先生效。需要持久化或使用只读根文件系统的部署,应挂载可写的配置目录。
已发布镜像支持 linux/amd64 与 linux/arm64。版本标签与 latest 指向同一多架构镜像:
制品与验证
GitHub Release 提供 19 个附件:Linux/macOS 的 tar.gz、Windows 的 ZIP,均覆盖 amd64/arm64;两种架构的 Linux RPM、DEB、APK 软件包,以及校验文件。全部制品摘要、11 份构建来源证明与两份 RPM 签名均已核验。签名 tag 对应的精确源码已通过 Go 测试、交叉编译、漏洞检查和发布流水线门禁。
发布验收覆盖软件包安装与卸载、容器配置,以及针对 SILO 的数据安全、元数据、导入与自动化检查。容器工作流 使用已验证的 Linux 发布程序,运行两种架构的镜像后才发布版本与 latest 清单。各平台制品见下载页。