| name | rclone-gdrive-auth-via-proxy |
| description | 在代理环境下通过 browser OAuth 完成 rclone Google Drive 授权 |
| triggers | ["rclone authorize drive 超时失败","Google OAuth i/o timeout","rclone sync 挂起无输出(token 过期/损坏)","rclone 命令 hang 住不返回"] |
rclone Google Drive 授权(代理环境)
背景
在网络无法直连 Google OAuth 服务器的环境下,通过本地代理完成 rclone 的 browser OAuth 授权。
前置条件
本地有代理工具运行(v2rayN、Clash 等),端口已知。
步骤
1. 找代理端口
ps aux | grep -E 'v2ray|xray|clash' | grep -v grep
for port in 10808 10809 10810 7890 7891 8080 8118; do
nc -z -w1 127.0.0.1 $port 2>/dev/null && echo "OPEN: $port"
done
2. 验证代理可用
export HTTPS_PROXY=http://127.0.0.1:10808
export HTTP_PROXY=http://127.0.0.1:10808
curl -s --max-time 5 https://www.google.com | head -1 && echo "PROXY OK"
3. 杀旧进程 + 后台运行 rclone authorize
必须先杀掉旧的后台进程,否则多进程抢 port 会导致 token 写入混乱:
pkill -f "rclone authorize" 2>/dev/null
sleep 1
export HTTPS_PROXY=http://127.0.0.1:10808
export HTTP_PROXY=http://127.0.0.1:10808
/Users/jinguo/bin/rclone authorize drive 2>&1 &
echo "PID: $!"
4. 在浏览器完成授权
命令行会输出本地监听地址,如:
http://127.0.0.1:53682/auth?state=xxx
手动在本机浏览器打开这个地址,用 Google 账号授权。授权成功后页面会显示 success。
5. 捕获 token 并手动写入配置
授权后命令行输出包含完整 JSON token(有效期 1 小时,refresh_token 永久有效):
{"access_token":"ya29...","token_type":"Bearer","refresh_token":"1//0eH...","expiry":"...","expires_in":3599}
手动写入 ~/.config/rclone/rclone.conf:
[gdrive-wiki]
type = drive
scope = drive
token = {"access_token":"ya29...","token_type":"Bearer","refresh_token":"1//0eH...","expiry":"...","expires_in":3599}
6. 验证
/Users/jinguo/bin/rclone lsd gdrive-wiki:
关键发现
- rclone OAuth 默认用 IPv6 路由,网络不支持会导致
dial tcp [2607:f8b0:400e:c1b::5f]:443: i/o timeout
- 设置
HTTPS_PROXY/HTTP_PROXY 后 rclone 自动走 IPv4 代理
- rclone config 需要 TTY,无法通过管道交互驱动;正确做法是后台运行然后从输出捕获 token
- token 因超时不会自动写回配置,必须手动 copy 输出中的 JSON
refresh_token 是永久有效的,不需要重新授权
- v2rayN 的代理端口通常是 10808(SOCKS5)
故障排查:rclone 挂起无输出
rclone 命令 hang 住不返回,且无错误输出,通常是以下原因:
1. Token 过期
检查 ~/.config/rclone/rclone.conf 中 expiry 字段。如果已过期,rclone 无法刷新 token 会 hang 住。
2. Token 被截断/损坏
token 字段包含 ... 等占位符(如 "ya29.a...0207"),说明之前复制时被截断。
rclone 解析 base64 失败会报 illegal base64 data,但有时也会 hang。
修复步骤:
cat > ~/.config/rclone/rclone.conf << 'EOF'
[gdrive-wiki]
type = drive
scope = drive
EOF
3. 配置文件位置
rclone 默认配置在 ~/.config/rclone/rclone.conf(不是 ~/.rclone.conf)。
如果找不到配置,用 find ~ -name "rclone.conf" 2>/dev/null 搜索。
4. 诊断命令
ps aux | grep rclone | grep -v grep
tail -20 ~/wiki/rclone-sync.log
export HTTPS_PROXY=http://127.0.0.1:10808
curl -s --max-time 5 https://www.googleapis.com/oauth2/v1/certs | head -1
⚠️ Cron 环境无法完成 OAuth 授权
关键限制: rclone authorize drive 需要浏览器交互(打开本地监听地址并登录 Google 账号),在 headless cron 环境中无法完成。cron 任务中 rclone token 过期后只能报错,不能自动修复。
推荐方案:使用 Google Service Account 替代 OAuth token
Service Account 使用 JSON key 文件认证,无需浏览器交互,适合 cron 自动化:
- 在 Google Cloud Console 创建 Service Account,生成 JSON key 文件
- 将 JSON key 放在
~/.config/rclone/service-account.json(权限 600)
- 修改 rclone 配置:
[gdrive-wiki]
type = drive
scope = drive
service_account_file = /Users/jinguo/.config/rclone/service-account.json
- 将 Google Drive 文件夹共享给 Service Account 的邮箱地址
诊断 token 是否过期:
grep -A5 "\[gdrive-wiki\]" ~/.config/rclone/rclone.conf
适用环境
- Mac 上有 v2rayN 等代理工具
- 网络出口需要代理才能访问 Google 服务