十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

rclone archive extract 全解析:从本地或任意远程自动解压归档到目标目录

rclone archive extract 全解析:从本地或任意远程自动解压归档到目标目录 rclone archive extract 全解析从本地或任意远程自动解压归档到目标目录【免费下载链接】rclonersync for cloud storage - Google Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Wasabi, Google Cloud Storage, Azure Blob, Azure Files, Yandex Files项目地址: https://gitcode.com/GitHub_Trending/rc/rclone本文围绕 rclone 自 v1.72 引入的rclone archive extract命令展开说明如何把云端或本地的 zip、tar 系列归档自动识别格式并解压到目标目录介绍它与rclone archive create/list及 archive 后端只读挂载解包的关系、过滤器filter配合筛选解压以及源码层面的安全边界Zip Slip 防穿越、./前缀剥离等实现细节。读完本文你将掌握该命令的完整用法、适用格式边界和底层工作原理可直接用于云端数据的按需解压场景。命令定位rclone 归档动作三件套中的解压一环rclone archive extract属于 rclone 自 v1.72 起提供的rclone archive归档动作命令族。它承担归档操作的取出方向把归档内容解压到目标目录并自动探测归档格式。与之配套的是同一版本引入的rclone archive create把源文件打成归档rclone archive list列出归档内容rclone archive归档命令的父命令要求必须携带具体动作子命令。从源码结构看命令注册在 archive.go 与 extract.gocmd/archive/extract包通过init()把Command挂到archive.Command之下最终形成rclone archive extract调用链。该功能只支持!plan9平台plan9 上由 extract_unsupported.go 占位编译。与 archive 后端的区别归档内容除了用该命令解压还可以通过archive 后端直接以只读方式访问。archive 后端的用法与限制见 archive.md它把归档文件变成目录结构可以配合rclone mount挂载后按需读取其中单个文件而无需下载/解压整个归档。两套机制的关键差异如下对比维度rclone archive extract命令archive 后端:archive:支持格式更广的非云友好格式zip、tar 及 tar.gz/tar.bz2/tar.xz/tar.zst 等不支持 squashfs仅.zip与.sqfssquashfs两类云友好格式是否可挂载否命令动作一次性完成可以用于rclone mount等读取场景是否可用于其他命令否不能用于rclone check等可参与rclone lsf、rclone copy、rclone hashsum等使用方式rclone archive extract 源 目标:archive:remote:dir前缀或type archive配置简单概括只想一次性建包、列包、解包就用 archive 命令想只读挂载、按需读取大归档则用 archive 后端。archive 后端之所以只支持 zip 与 squashfs是因为这两种格式内置了索引central directory / 元数据索引表能不解压整个归档就定位单个文件即云友好而 tar 是流式无索引格式单文件访问能力差故 archive 后端不采用但archive命令因为是一次性流式处理不受此限制。语法与基本用法命令通用语法为rclone archive extract [flags] source destination其中source是归档文件远端或本地路径destination是解压目标目录。source、destination均可为本地路径或 rclone remote也允许一方本地一方远程的混搭。注意源不能是目录——它必须指向一个归档文件。支持的归档格式解压时命令会自动探测归档格式无需像create那样显式指定--format。能够识别、解压的格式范围与 create 侧保持一致即下面这些create 命令文档列出格式扩展名zip.ziptar.tartar.gz.tar.gz、.tgz、.taztar.bz2.tar.bz2、.tb2、.tbz、.tbz2、.tz2tar.lz.tar.lztar.lz4.tar.lz4tar.xz.tar.xz、.txztar.zst.tar.zst、.tzsttar.br.tar.brtar.sz.tar.sztar.mz.tar.mz与 create 命令通过--format指定或按目标扩展名猜测不同extract 是靠读取源文件头部内容由底层归档库自动识别因此它对源文件名的扩展名并不敏感。一个完整的远端解压示例官方示例先在 archive 远端上有一个archive.zip可用rclone archive list查看其内部结构$ rclone archive list --long remote:archive.zip 6 2025-10-30 09:46:23.000000000 file.txt 0 2025-10-30 09:46:57.000000000 dir/ 4 2025-10-30 09:46:57.000000000 dir/bye.txt执行解压把remote:archive.zip的内容展开到remote:extracted目录$ rclone archive extract remote:archive.zip remote:extracted随后用rclone tree验证解压结果归档内的目录层级被完整还原$ rclone tree remote:extracted / ├── dir │ └── bye.txt └── file.txt整个过程与create互为逆操作由rclone archive create remote:dir remote:archive.zip打出来的包可以直接用rclone archive extract remote:archive.zip remote:out还原出remote:out下的完整目录树含目录项与文件的修改时间文件经Rcat写出。使用过滤器只解压需要的文件实际场景中大归档往往只需要其中一部分文件。extract 与 rclone 其余命令一样支持filter 过滤器如--include、--exclude、--min-size等全局过滤标志每个归档条目在写出前都会经过过滤判断不匹配的条目直接跳过连目录项创建也被跳过。官方示例只解压匹配bye.*的文件$ rclone archive extract archive.zip partial --include bye.* $ rclone tree partial / └── dir └── bye.txt注意file.txt没有被解出。过滤器在条目层生效源码 extract.go 中每个条目在解包回调里先调用fi.Include(remote, f.Size(), f.ModTime(), ...)fi即filter.GetConfig(ctx)判断是否放行目录条目也会被过滤从而避免生成只含空目录的残留结构。交互行为与可感知的边界情况目标目录不存在时会被自动创建源码中 extract 会先对dst调用Mkdir(dstDir)失败即报 unable to access destination。源是目录会直接报错 source cant be a directory源找不到则报 source not found。抽取过程挂在 rclone 的accounting统计体系上accounting.Stats注册传输对象与rclone copy等操作共享传输计数与日志命令结束时打印Total files extracted N汇总信息。支持全局的--dry-run试运行模拟执行、统计将解出的文件数但不真正写盘源码中对目录与文件分别有if ci.DryRun { return nil }分支。全局过滤、--dry-run、--transfers、--log-level等全局参数不在此处列出见官方生成的 global flags 文档autogenerated。命令自身选项rclone archive extract没有独立参数选项只有-h, --help help for extract其余全部继承自全局 flags 体系这也解释了为何解压行为天然与 rclone 的过滤器、断点重试、日志、统计等能力一致。源码深读从识别格式到安全落盘的完整链路extract 的核心实现集中在 cmd/archive/extract/extract.go 的ArchiveExtract()函数其处理链路可分为五步定位源对象src.NewObject(ctx, srcFile)拿到归档对应的fs.Object区分fs.ErrorIsDir源是目录与fs.ErrorObjectNotFound源不存在两类错误分别给出明确报错。创建目标目录dst.Mkdir(ctx, dstDir)保证目标 remote 根目录存在。打开并缓冲源数据把源对象接入 accountingNewTransferAccount包装为支持ReadAtSeeker的读取器——这个能力对自动识别格式至关重要因为探测归档头部后还需能回到起点重新流式读取全部条目。自动探测格式调用归档库archives.Identify()探测格式随后断言该格式是否实现了archives.Extraction接口未实现则报 extraction for 格式 not supported日志中会打印Extract 源, format 格式 to 目标。逐条目解出对每个归档条目先经destPath()做路径安全映射再经fi.Include()做过滤器判定目录条目直接operations.Mkdir文件条目用operations.Rcat写出保留条目自带 ModTime。安全设计拒绝 Zip Slip 路径穿越归档内容是攻击者可控的可能来自不可信来源因此destPath()承担了关键的安全职责源码注释明确以 Zip Slip 为例解释了两个处理点剥离开头的./用tar -czf archive.tar.gz .这类相对路径创建的 tar 归档条目名会带./前缀如不剥离rclone 的路径编码会把.转成全角点字符产生一个幽灵目录。拒绝一切含..路径分量的条目若不拦截path.Join会把../escaped.txt拼接到目标后坍缩成越界路径从而写出目标目录之外——这正是 Zip Slip 攻击手法。拦截时/与\都被视为路径分隔符因为本地后端在 Windows 上把\当路径分隔符恶意归档可能用反斜杠绕过检查。extract_test.go 用 13 组用例对destPath()做了逐项验证覆盖正常路径剥离./file.txt、./subdir/file.txt、嵌套路径不变、拼接目标前缀safe/prefix/file.txt、归档根条目./返回空串被跳过只剥离一次前导./././file.txt得到./file.txt保持原义不做过度规整攻击路径拦截../etc/passwd、带目标前缀的../escaped.txt、内部穿越dir/../../escaped.txt、尾部dir/..、反斜杠版..\escaped.txt、混合版dir\..\..\escaped.txt全部返回错误。因此rclone archive extract对不可信来源归档也具备目录逃逸防护这是它作为云端解压工具非常值得信赖的安全属性。与 create/list 的格式分工命令族内部对格式的处理思路是一边造、一边看、一边取create 负责把源目录按规则打进上述 zip/tar 系格式list 负责只读列出内容extract 负责自动探测并解出。三者共用同一父命令与 rclone 的 cmd 基础设施格式支持表保持一致但都不会读写 squashfs——squashfs 只能由 archive 后端backend/archive 目录通过内部 VFS 读取。限制与适用提醒源必须是文件命令不接受目录作为源。目标写法为目录解压时会把归档根内容放入该目录可与--include组合实现选择性恢复。本命令不支持 squashfs那是 archive 后端的领域也不能用于 mount/check 等其他 rclone 命令的输入。归档内的文件名若为 rclone 编码规则所需写入时经 standard 编码处理目录/文件修改时间按归档条目携带值写入。若要解压的归档非常巨大且只需其中少数文件优先考虑 archive 后端 只读访问避免全量流式解压带来的网络与 IO 开销。快速参考# 基本解压本地或 remote 均可、可混搭 rclone archive extract remote:archive.zip remote:extracted rclone archive extract /path/backup.tar.gz s3:bucket/restored # 只解压部分文件 rclone archive extract archive.zip partial --include *.txt --exclude test/* # 试运行不真正写盘 rclone archive extract --dry-run archive.zip partial # 先看包内有什么 rclone archive list remote:archive.zip一句话总结rclone archive extract用一条命令把自动识别归档格式 云端直解 过滤 防路径穿越整合在一起配合rclone archive create/list与 archive 后端构成 rclone v1.72 起完整的云端归档管理闭环。【免费下载链接】rclonersync for cloud storage - Google Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Wasabi, Google Cloud Storage, Azure Blob, Azure Files, Yandex Files项目地址: https://gitcode.com/GitHub_Trending/rc/rclone创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表