rclone put.io 后端使用指南:从 OAuth 配置、上传原理到限流策略 📅 发布时间:2026/9/8 23:11:47 👁 浏览次数: rclone put.io 后端使用指南从 OAuth 配置、上传原理到限流策略【免费下载链接】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/rcloneput.io 是一款以“下载即云端托管”为特色的存储服务rclone 通过内置的putio后端将其完整接入统一命令行生态路径写法与其它远端完全一致。本篇以仓库中的官方文档 docs/content/putio.md 为主线结合 backend/putio 下的源码实现讲解putio后端的远程配置、常用命令、全部可调参数、受限文件名处理规则、断点续传式 tus 上传流程以及速率限制应对策略使读者能够独立完成配置并在命令行中可靠地同步 put.io 数据。远程路径表示与基本使用put.io 的路径与 rclone 其它存储后端保持同一套语法remote:path。路径深度没有限制可以随意嵌套子目录例如remote:directory/subdirectory表示 put.io 远端上的directory/subdirectory。remote:单独出现时指向远端根目录。配置好远端之后最常用的三个操作# 列出 put.io 顶层目录 rclone lsd remote: # 列出 put.io 中的所有文件 rclone ls remote: # 将本地目录复制为 put.io 下的 backup 目录 rclone copy /home/source remote:backup初始化配置走 OAuth 授权流程put.io 后端通过 OAuth2 授权获取访问令牌。首次设置需要你在浏览器中完成一次 put.io 登录授权rclone config会一步步引导你完成整个过程。先运行rclone config以下是交互过程的完整示例以新建一个名为putio的 remote 为例No remotes found, make a new one? n) New remote s) Set configuration password q) Quit config n/s/q n name putio Type of storage to configure. Enter a string value. Press Enter for the default (). Choose a number from below, or type in your own value [snip] XX / Put.io \ putio [snip] Storage putio ** See help for putio backend at: https://rclone.org/putio/ ** Remote config Use web browser to automatically authenticate rclone with remote? * Say Y if the machine running rclone has a web browser you can use * Say N if running rclone on a (remote) machine without web browser access If not sure try Y. If Y failed, try N. y) Yes n) No y/n y If your browser doesnt open automatically go to the following link: http://127.0.0.1:53682/auth Log in and authorize rclone for access Waiting for code... Got code -------------------- [putio] type putio token {access_token:XXXXXXXX,expiry:0001-01-01T00:00:00Z} -------------------- y) Yes this is OK e) Edit this remote d) Delete this remote y/e/d y Current remotes: Name Type putio putio e) Edit existing remote n) New remote d) Delete remote r) Rename remote c) Copy remote s) Set configuration password q) Quit config e/n/d/r/c/s/q q授权过程中的两个关键细节本地回环 Web 服务器。若选择浏览器自动授权方式rclone 会在本地机器上临时启动一个 Web 服务器用于接收 put.io 返回的令牌与验证码监听地址为http://127.0.0.1:53682/。它只在你打开浏览器到取回验证码这段时间内运行。如果你的主机开启了防火墙可能需要临时放行该端口或改用下面的手动模式。源码中这一行为由oauthutil.RedirectLocalhostURL提供见 backend/putio/putio.go 的putioConfig定义。无浏览器的服务器场景。如果你的运行环境没有可用的浏览器例如远程服务器、容器请选择n手动模式。具体方法参见仓库中的 remote_setup.md其中介绍了三种替代方案使用rclone authorize在本地先换取令牌、直接复制已有配置文件以及通过 SSH 隧道把远端端口转发回本地完成浏览器授权。可配置参数一览putio 后端的参数在文档中分为 Standard标准与 Advanced高级两类。所有参数既可以在rclone config交互界面中填写也可以通过环境变量注入环境变量优先于配置文件。以下参数信息继承自 docs/content/putio.md 的自动生成部分其源头是 backend/putio/putio.go 中注册的fs.RegInfo。标准参数参数Config 键环境变量类型必填说明--putio-client-idclient_idRCLONE_PUTIO_CLIENT_IDstring否OAuth Client Id通常留空使用 rclone 内置的默认值--putio-client-secretclient_secretRCLONE_PUTIO_CLIENT_SECRETstring否OAuth Client Secret通常留空所谓“留空即可”是因为 rclone 为 putio 后端内置了一套共享的 OAuth 应用凭据源码中可见内置ClientID与经过obscure混淆的ClientSecret见 backend/putio/putio.go。只有当你需要自建 put.io OAuth 应用时才需覆盖这两项。高级参数参数Config 键环境变量类型默认值说明--putio-tokentokenRCLONE_PUTIO_TOKENstring无OAuth Access Token以 JSON blob 形式存放自动生成通常无需手改--putio-auth-urlauth_urlRCLONE_PUTIO_AUTH_URLstring无Auth 服务器 URL留空使用 put.io 默认值--putio-token-urltoken_urlRCLONE_PUTIO_TOKEN_URLstring无Token 服务器 URL留空使用 put.io 默认值--putio-client-credentialsclient_credentialsRCLONE_PUTIO_CLIENT_CREDENTIALSboolfalse使用 RFC 6749 定义的 OAuth2 client credentials 流程注意并非所有后端都支持该流程--putio-encodingencodingRCLONE_PUTIO_ENCODINGEncodingSlash,BackSlash,Del,Ctl,InvalidUtf8,Dot后端文件名编码规则见下文--putio-descriptiondescriptionRCLONE_PUTIO_DESCRIPTIONstring无该 remote 的描述文字put.io 后端使用的 OAuth 默认端点为认证 URLhttps://api.put.io/v2/oauth2/authenticate令牌 URLhttps://api.put.io/v2/oauth2/access_tokenencoding 参数的实际作用put.io 的文件名最终会写入 JSON 字符串参与 API 传输因此它需要比其它后端更严格的编码规则。在 backend/putio/putio.go 中该后端的 encoding 默认值由三部分拼成Default: (encoder.Display | encoder.EncodeBackSlash | encoder.EncodeInvalidUtf8),Display是 rclone 几乎所有后端共用的基础编码集最终渲染出的有效规则即文档所列Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot。这些位对应的具体含义详见 lib/encoder/encoder.go 中的编码器实现是Slash对/编码因为斜杠是路径分隔符BackSlash对\0x5C编码这是 put.io 特有的一条限制Del对 DEL0x7F控制字符编码Ctl对 0x01–0x1F 的控制字符编码InvalidUtf8对非法 UTF-8 字节编码Dot对.与..这类特殊名称编码。凡是目录操作FindLeaf、CreateDir与对象上传都经由Enc.FromStandardName()/Enc.ToStandardName()做双向转换因此对用户而言整个替换过程是透明的。受限文件名与替换规则除了 overview.md 中说明的 rclone 通用受限字符集之外put.io 后端还额外处理一个字符字符值替换为\反斜杠0x5C全角反斜杠也就是说本地文件名中的反斜杠在上传后会被存储为全角形似的下载时再自动转回从而避免名字歧义。此外由于 put.io 的 API 需要把文件名放进 JSON 字符串非法 UTF-8 字节也会被替换与 overview.md 中 Invalid UTF-8 一节描述的处理机制一致。源码视角putio 后端是如何工作的以下实现事实均可直接在 backend/putio 目录中验证。后端注册与能力声明init()中通过fs.Register注册Name: putio的后端并将NewFs设为入口见 backend/putio/putio.go。创建Fs实例后声明了一批能力位见 backend/putio/fs.goDuplicateFiles: true——put.io 允许重名文件因此做同步时要留意rclone dedupe的使用场景ReadMimeType: true——对象携带 Content-TypeMimeType()直接返回 put.io 元数据中的类型见 backend/putio/object.goCanHaveEmptyDirectories: true——支持空目录。接口断言列表backend/putio/putio.go显示该后端实现了fs.Purger、fs.PutUncheckeder、fs.Abouter、fs.Mover、fs.DirMover、fs.Copier、fs.CleanUpper、fs.MimeTyper、fs.IDer等大量可选接口因此move、copy、purge、cleanup、about等高级命令在 putio 后端上都有原生支持。目录缓存与列表put.io 的 API 以“目录 ID 子项”为模型根目录 ID 固定为0。rclone 用dircache.DirCache见 backend/putio/fs.go把目录路径映射到目录 IDList通过Files.List(ctx, parentID)拉取某目录下全部子项目录写入 dirCache、文件包成fs.Object见 backend/putio/fs.go。当目标路径不存在时NewFs会按“路径指向单个文件”回退处理并返回fs.ErrorIsFile。上传采用可断点续传的 tus 协议putio后端的上传链路较为独特它没有使用 put.io 的传统 multipart 接口而是走tus resumable 上传协议创建上传向https://upload.put.io/files/发送POST携带tus-resumable: 1.0.0、upload-length以及 base64 编码的upload-metadata内含文件名、no-torrent true、父目录 ID、updated-at时间服务端在Location响应头返回上传 URL见 backend/putio/fs.go。分块传输按defaultChunkSize 48 * fs.Mebi约 48 MiB见 backend/putio/putio.go把数据切成可重复读取的分块逐个通过PATCH发送upload-offset头标注当前偏移。断点恢复若发生409offset mismatch或偏移校验失败serverOffset ! transferOffset reqSize即连接中断代码会先对上传 URL 发HEAD读取服务端的upload-offset再对 chunk 执行Seek后重传剩余部分直至全部完成见 backend/putio/fs.go。每个分块完成后从响应头的putio-file-id取到文件 ID整块传完后再Files.Get一次完整元数据以构造最终对象。零字节文件则直接发送一个空分块。服务端拷贝与移动putio后端原生实现了服务端侧Copy、Move、DirMove分别映射到 put.io API 的/v2/files/copy与/v2/files/move见 backend/putio/fs.go。其中服务端复制有一个值得注意的实现细节由于 put.io API 在目标目录已存在同名文件时会返回NAME_ALREADY_EXIST错误rclone 会先把副本以“原名 8 位随机后缀”的临时名字复制过去随后删除已存在的目标文件再用/v2/files/rename把临时副本改回正式名字见 backend/putio/fs.go。因此即便 put.io 允许重名用 rclone 做服务端 copy 也不会留下重复文件。对象元数据与哈希putio后端的对象总是携带完整元数据Size()直接取文件大小ID()暴露 put.io 文件 IDfs.IDer接口ModTime()以UpdatedAt为准。文件时间戳精度为秒——Precision()返回time.SecondSetModTime()调用/v2/files/touch后也会把本地缓存时间Truncate(time.Second)以保证与下一次列表返回的修改时间完全一致见 backend/putio/object.go。putio 后端唯一支持的校验和是CRC32Hashes()返回hash.Set(hash.CRC32)见 backend/putio/fs.go它直接取自 put.io 元数据字段不额外计算。这意味着--checksum类比较与rclone check在 putio 后端上依赖 CRC32 完成。另外backend/putio/putio.go 中定义了一个忽略文件名正则凡是匹配desktop.ini、thumbs.db、.ds_store或icon\r的对象在更新上传时会被跳过见 backend/putio/object.go。配额查询与垃圾回收About接口通过 put.io 账户信息接口拿到配额数据映射为 rclone 的Total / Used / Free见 backend/putio/fs.go因此可以直接用rclone about remote:查看 put.io 存储用量。CleanUp则调用/v2/trash/empty清空云端回收站。速率限制与重试策略put.io 对 API 有速率限制。官方文档 docs/content/putio.md 的 Limitations 一节明确说明当你触碰到限制时rclone 会自动等待服务端要求的时长后再重试。这一点在源码中有精确实现。所有 API 调用都包裹在pacer中默认最小间隔 10ms、最大 2s、指数衰减见 backend/putio/putio.go而 backend/putio/error.go 的shouldRetry对错误分类如下收到 HTTP429 Too Many Requests时读取响应头x-ratelimit-reset服务端指定的 Unix 重置时间计算并等待剩余时间后再重试若没有该头则按默认 60 秒休眠defaultRateLimitSleepput.io 的回收站操作是按账户串行化的并发删除可能返回400 TRASH_LOCK_TIMEOUT这种错误同样值得重试5xx类错误被标记为临时性错误交由通用重试机制处理4xx 中的 404、409 等则按业务语义对象不存在、上传偏移不一致走各自的恢复逻辑。如果你希望“从一开始就尽可能不触碰限制”可以在命令中附加低数值的--tpslimit标志来限制每秒事务数。注意put.io 对不同类型的操作可能施加不同的限制值而且限制策略会随时间变化因此不存在一个永远最优的固定数值。测试与验证该后端的正确性由集成测试保证。backend/putio/putio_test.go 通过fstest/fstests的通用测试框架运行以TestPutio:作为测试 remote 名覆盖创建目录、上传下载、拷贝移动、删除、元数据与哈希等全部文件系统接口。这意味着只要配置好了名为TestPutio的 remote仓库内所有后端共用的文件系统一致性测试都可以直接针对 put.io 跑通。小结put.io 后端是 rclone“一个命令行管所有云盘”理念的典型代表标准remote:path语法、交互式 OAuth 配置、透明文件名编码加上以 tus 协议实现的分块断点续传和自动限流重试让它既适合日常手动ls/copy也能支撑大规模自动化同步任务。相关通用机制文件名受限字符替换、encoding 编码原理、remote 无浏览器配置法可继续参阅 overview.md 与 remote_setup.md实现细节则可直接阅读 backend/putio 目录下的putio.go、fs.go、object.go与error.go。【免费下载链接】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),仅供参考