---
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