☰
rclone put.io 后端使用指南:从 OAuth 配置、上传原理到限流策略
2026/11/1 4:18:59 网站建设 项目流程

rclone put.io 后端使用指南:从 OAuth 配置、上传原理到限流策略

【免费下载链接】rclone"rsync 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

put.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 doesn't 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 默认端点为:

  • 认证 URL:https://api.put.io/v2/oauth2/authenticate
  • 令牌 URL:https://api.put.io/v2/oauth2/access_token

encoding 参数的实际作用

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:对 DEL(0x7F)控制字符编码;
  • 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.go):

  • DuplicateFiles: true——put.io 允许重名文件,因此做同步时要留意rclone dedupe的使用场景;
  • ReadMimeType: true——对象携带 Content-Type(MimeType()直接返回 put.io 元数据中的类型,见 backend/putio/object.go);
  • CanHaveEmptyDirectories: 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)把目录路径映射到目录 ID,List通过Files.List(ctx, parentID)拉取某目录下全部子项,目录写入 dirCache、文件包成fs.Object(见 backend/putio/fs.go)。当目标路径不存在时,NewFs会按“路径指向单个文件”回退处理并返回fs.ErrorIsFile。

上传采用可断点续传的 tus 协议

putio后端的上传链路较为独特,它没有使用 put.io 的传统 multipart 接口,而是走tus resumable 上传协议:

  1. 创建上传:向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)。
  2. 分块传输:按defaultChunkSize = 48 * fs.Mebi(约 48 MiB,见 backend/putio/putio.go)把数据切成可重复读取的分块,逐个通过PATCH发送,upload-offset头标注当前偏移。
  3. 断点恢复:若发生409(offset 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 文件 ID(fs.IDer接口),ModTime()以UpdatedAt为准。文件时间戳精度为秒——Precision()返回time.Second,SetModTime()调用/v2/files/touch后也会把本地缓存时间Truncate(time.Second),以保证与下一次列表返回的修改时间完全一致(见 backend/putio/object.go)。

putio 后端唯一支持的校验和是CRC32(Hashes()返回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 秒休眠(defaultRateLimitSleep);
  • put.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。

【免费下载链接】rclone"rsync 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询