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-id | client_id | RCLONE_PUTIO_CLIENT_ID | string | 否 | OAuth Client Id,通常留空(使用 rclone 内置的默认值) |
--putio-client-secret | client_secret | RCLONE_PUTIO_CLIENT_SECRET | string | 否 | OAuth Client Secret,通常留空 |
所谓“留空即可”,是因为 rclone 为 putio 后端内置了一套共享的 OAuth 应用凭据(源码中可见内置ClientID与经过obscure混淆的ClientSecret,见 backend/putio/putio.go)。只有当你需要自建 put.io OAuth 应用时才需覆盖这两项。
高级参数
| 参数 | Config 键 | 环境变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|---|---|
--putio-token | token | RCLONE_PUTIO_TOKEN | string | 无 | OAuth Access Token,以 JSON blob 形式存放(自动生成,通常无需手改) |
--putio-auth-url | auth_url | RCLONE_PUTIO_AUTH_URL | string | 无 | Auth 服务器 URL,留空使用 put.io 默认值 |
--putio-token-url | token_url | RCLONE_PUTIO_TOKEN_URL | string | 无 | Token 服务器 URL,留空使用 put.io 默认值 |
--putio-client-credentials | client_credentials | RCLONE_PUTIO_CLIENT_CREDENTIALS | bool | false | 使用 RFC 6749 定义的 OAuth2 client credentials 流程;注意并非所有后端都支持该流程 |
--putio-encoding | encoding | RCLONE_PUTIO_ENCODING | Encoding | Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot | 后端文件名编码规则(见下文) |
--putio-description | description | RCLONE_PUTIO_DESCRIPTION | string | 无 | 该 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 上传协议:
- 创建上传:向
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头标注当前偏移。 - 断点恢复:若发生
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对错误分类如下:
- 收到 HTTP
429 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),仅供参考