跳转到主要内容

mcli 20261109:数据安全与自动化修复

mcli 20261109:修复删除与搬移安全、分片下载、失败退出码、元数据处理和 batch 状态观察。

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 会忽略空条目,因此允许末尾分号和连续分号:

mcli cp --attr 'owner=alice;;team=ops;' report.txt ALIAS/BUCKET/report.txt

缺少 = 的非空条目、未闭合引号,以及不含任何键值条目的输入(例如 ;)仍然报错。被引号包围的值中的分号仍属于值本身。

生成的上传命令

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 指向同一多架构镜像:

docker pull pgsty/mc:RELEASE.2026-11-09T00-00-00Z
docker run --rm pgsty/mc:RELEASE.2026-11-09T00-00-00Z --version

制品与验证

GitHub Release 提供 19 个附件:Linux/macOS 的 tar.gz、Windows 的 ZIP,均覆盖 amd64/arm64;两种架构的 Linux RPM、DEB、APK 软件包,以及校验文件。全部制品摘要、11 份构建来源证明与两份 RPM 签名均已核验。签名 tag 对应的精确源码已通过 Go 测试、交叉编译、漏洞检查和发布流水线门禁。

发布验收覆盖软件包安装与卸载、容器配置,以及针对 SILO 的数据安全、元数据、导入与自动化检查。容器工作流 使用已验证的 Linux 发布程序,运行两种架构的镜像后才发布版本与 latest 清单。各平台制品见下载页。

完整更新日志 · 相对 20261026 的变更 · 兼容性说明