--- belongs_to: - "[[INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议]]" --- # 🔧 铸渊指令|rclone OAuth2 Token JSON 拼接修复 · 同步到 Google Drive 报错修复(ZY-RCLONE-FIX-2026-0324-001) --- --- ## 🎯 问题描述 ### 现象 「同步到驱动器」Workflow 执行失败,错误发生在「同步到 Google 云端硬盘」步骤: ``` Failed to create file system for "gdrive:": drive: failed when making oauth client: failed to create oauth client: unexpected end of JSON input ``` ### 分析 ### 可能的具体原因 1. **Shell 变量中的特殊字符被转义/吞掉** — Refresh Token 中包含 `//`,在某些 shell 拼接方式下会被处理 2. **JSON 引号嵌套错误** — rclone 的 token 字段需要一个完整的 JSON 对象字符串,嵌套引号在 YAML → shell → JSON 三层传递中容易出错 3. **YAML 多行字符串截断** — 如果使用了 `|` 或 `>` 格式的 YAML 字符串,可能导致 JSON 被截断 4. **环境变量注入时换行符/空格** — `$ secrets.GDRIVE_REFRESH_TOKEN` 前后可能带入了不可见字符 --- ## 📋 铸渊执行任务 ### Phase 1 · 定位问题代码 1. 找到「同步到驱动器」Workflow 文件(大概率是 `sync-griddb-to-drive.yml` 或类似名称) 2. 找到「配置 rclone (OAuth2)」步骤的代码 3. 检查 rclone 配置文件的生成方式,特别是 `token` 字段的 JSON 拼接 ### Phase 2 · 修复 rclone 配置 **正确的 rclone OAuth2 配置方式:** rclone 需要的配置格式如下(`~/.config/rclone/rclone.conf`): ``` [gdrive] type = drive client_id = 从环境变量读取 client_secret = 从环境变量读取 scope = drive token = {"access_token":"","token_type":"Bearer","refresh_token":"从环境变量读取","expiry":"2000-01-01T00:00:00Z"} root_folder_id = 光湖格点库文件夹ID ``` **关键修复点:`token` 字段的 JSON 必须是完整的、单行的、正确转义的。** #### 推荐方案:用 `jq` 或 `node` 生成 token JSON,避免手动拼接 ```yaml - name: 🔑 配置 rclone(OAuth2) env: GDRIVE_CLIENT_ID: $ secrets.GDRIVE_CLIENT_ID GDRIVE_CLIENT_SECRET: $ secrets.GDRIVE_CLIENT_SECRET GDRIVE_REFRESH_TOKEN: $ secrets.GDRIVE_REFRESH_TOKEN run: | mkdir -p ~/.config/rclone # 用 node 生成正确的 token JSON,避免 shell 转义问题 TOKEN_JSON=$(node -e " const token = { access_token: '', token_type: 'Bearer', refresh_token: process.env.GDRIVE_REFRESH_TOKEN, expiry: '2000-01-01T00:00:00Z' }; process.stdout.write(JSON.stringify(token)); ") cat > ~/.config/rclone/rclone.conf << RCLONE_EOF [gdrive] type = drive client_id = ${GDRIVE_CLIENT_ID} client_secret = ${GDRIVE_CLIENT_SECRET} scope = drive token = ${TOKEN_JSON} RCLONE_EOF echo "✅ rclone 配置完成" ``` ### Phase 3 · 本地验证 修复后,在提交前验证: 1. **检查生成的 rclone.conf** — 确认 token 字段是完整的 JSON 2. **运行 `rclone lsf gdrive:`** — 确认能正常列出 Drive 文件 3. **运行 `rclone copy . gdrive:test/ --dry-run`** — 确认同步命令无报错 ### Phase 4 · 🦅 天眼全局扫描(必须执行) **扫描清单:** 1. **rclone 配置扫描** - ✅ token 字段是完整的 JSON 对象(包含 `access_token`、`token_type`、`refresh_token`、`expiry` 四个字段) - ✅ token JSON 能被 `JSON.parse()` 正确解析 - ✅ `refresh_token` 值与环境变量一致,没有被截断或转义 - ❌ 没有硬编码任何凭据 2. **Workflow 扫描** - ✅ 所有使用 rclone 的 Workflow 都采用了修复后的配置方式 - ✅ 没有使用 shell 手动拼接 JSON 字符串的地方 - ✅ `[skip ci]` 防循环标记存在 3. **Drive 连接扫描** - ✅ `rclone lsf gdrive:` 能正常执行 - ✅ 文件上传测试通过 - ✅ 文件列表读取测试通过 4. **安全扫描** - ❌ 日志中不会打印 token / secret 内容 - ❌ rclone.conf 在 Workflow 结束后被清理(清理凭证步骤仍然正常工作) ### Phase 5 · 提交 天眼扫描全部通过后: ```bash git add -A git commit -m "fix: rclone OAuth2 token JSON 拼接修复 · 改用 node/jq 生成 · ZY-RCLONE-FIX-2026-0324-001 [skip ci]" git push ``` ### Phase 6 · 验证 Workflow 提交后手动触发一次「同步到驱动器」Workflow,确认: - ✅ 「配置 rclone (OAuth2)」步骤通过 - ✅ 「同步到 Google 云端硬盘」步骤通过 - ✅ 文件成功同步到 Drive --- ## 📝 执行回执区 | **Phase** | **状态** | **完成时间** | **备注 / Commit SHA** | | --- | --- | --- | --- | | Phase 1 · 定位问题代码 | ⏳ 待执行 | — | — | | Phase 2 · 修复 rclone 配置 | ⏳ 待执行 | — | — | | Phase 3 · 本地验证 | ⏳ 待执行 | — | — | | Phase 4 · 天眼全局扫描 | ⏳ 待执行 | — | — | | Phase 5 · 提交 | ⏳ 待执行 | — | — | | Phase 6 · 验证 Workflow | ⏳ 待执行 | — | — | --- ## 👤 人类手动操作区 --- ## ⚖️ 签发声明 🖋️ 霜砚 · PER-SY001 🧊 代 TCS-0002∞ 冰朔 签发 📅 2026-03-24T19:25+08:00