#!/bin/bash # 试试 cert.pem 里那个 apiToken 能不能直接用。 # # cloudflared 的 CLI 报 unauthorized,但 cert.pem 里明明带着: # {"zoneID":"...","accountID":"...","apiToken":"cfut_..."} # 直接拿这个 token 调 Cloudflare API,说不定能绕过 CLI 的问题。 set -u CF_DIR=/root/.cloudflared CERT="$CF_DIR/cert.pem" BODY=$(sed -n '/BEGIN ARGO TUNNEL TOKEN/,/END ARGO TUNNEL TOKEN/p' "$CERT" \ | grep -v 'BEGIN\|END' | tr -d '\n') PAD=$(( (4 - ${#BODY} % 4) % 4 )) for _ in $(seq 1 $PAD); do BODY="${BODY}="; done INFO=$(echo "$BODY" | base64 -d 2>/dev/null) ACCOUNT=$(echo "$INFO" | python3 -c 'import json,sys; print(json.load(sys.stdin).get("accountID",""))' 2>/dev/null) ZONE=$(echo "$INFO" | python3 -c 'import json,sys; print(json.load(sys.stdin).get("zoneID",""))' 2>/dev/null) TOKEN=$(echo "$INFO" | python3 -c 'import json,sys; print(json.load(sys.stdin).get("apiToken",""))' 2>/dev/null) echo " accountID: ${ACCOUNT:-(没解出来)}" echo " zoneID: ${ZONE:-(没解出来)}" echo " apiToken: ${TOKEN:0:12}…(长度 ${#TOKEN})" echo if [ -z "$TOKEN" ]; then echo " ✗ token 没解出来" exit 1 fi API=https://api.cloudflare.com/client/v4 AUTH="Authorization: Bearer $TOKEN" echo "===== 1. token 本身有效吗 =====" code=$(timeout 15 curl -4 -s -o /tmp/tv.json -w '%{http_code}' \ -H "$AUTH" "$API/user/tokens/verify" 2>/dev/null) echo " /user/tokens/verify -> HTTP ${code:-超时}" head -c 300 /tmp/tv.json 2>/dev/null | sed 's/^/ /' echo echo "===== 2. 列隧道 =====" code=$(timeout 20 curl -4 -s -o /tmp/tl.json -w '%{http_code}' \ -H "$AUTH" "$API/accounts/$ACCOUNT/cfd_tunnel?is_deleted=false" 2>/dev/null) echo " /accounts/\$ACCOUNT/cfd_tunnel -> HTTP ${code:-超时}" if [ "${code:-0}" = "200" ]; then python3 - <<'PY' import json try: d = json.load(open('/tmp/tl.json')) except Exception as exc: print(f" 解析失败: {exc}"); raise SystemExit print(f" success={d.get('success')} 错误={d.get('errors')}") for t in (d.get('result') or []): print(f" 已有隧道: {t.get('name')} id={t.get('id')}") PY else head -c 400 /tmp/tl.json 2>/dev/null | sed 's/^/ /' fi echo echo "===== 3. 列 DNS 记录(看 zone 权限)=====" code=$(timeout 20 curl -4 -s -o /tmp/zd.json -w '%{http_code}' \ -H "$AUTH" "$API/zones/$ZONE/dns_records?per_page=3" 2>/dev/null) echo " /zones/\$ZONE/dns_records -> HTTP ${code:-超时}" if [ "${code:-0}" = "200" ]; then python3 - <<'PY' import json try: d = json.load(open('/tmp/zd.json')) except Exception: raise SystemExit print(f" success={d.get('success')}") for r in (d.get('result') or [])[:3]: print(f" {r.get('type')} {r.get('name')} -> {str(r.get('content'))[:40]}") PY else head -c 400 /tmp/zd.json 2>/dev/null | sed 's/^/ /' fi echo echo "===== 4. 列账号(看 account 权限)=====" code=$(timeout 15 curl -4 -s -o /tmp/ac.json -w '%{http_code}' \ -H "$AUTH" "$API/accounts/$ACCOUNT" 2>/dev/null) echo " /accounts/\$ACCOUNT -> HTTP ${code:-超时}" head -c 250 /tmp/ac.json 2>/dev/null | sed 's/^/ /' echo echo echo "===== 结论 =====" echo " 如果上面 tunnel 那项是 200,我就能用 API 直接建隧道," echo " 绕开 cloudflared CLI 的 unauthorized。"