我让我的几个 claude 账号自己换着用了
五小时墙,和切号的麻烦
天天用 claude code 的人应该都撞过那个五小时的用量墙:干着干着,5h 窗口满了,就得停下来等重置。我手里有多个号(一个个人 max、一个工作 max),第一反应肯定是切号。但 macOS 上切号的真实情况大概是这样的:
- 切号等于重新登录。要走一遍浏览器认证,正在跑的 session 会丢登录,你干到哪儿也丢了。
- 改配置文件没用。
~/.claude/.credentials.json只是个镜像,改了对运行中的 session 没有任何影响。市面上的切号工具大多在改这个文件,在 macOS 上等于白改。 - 你不知道每个号还剩多少。哪个号的 5h 窗口快满了、哪个号的登录悄悄过期了,没有地方告诉你,等你发现基本是 session 报错的那一刻。
- 就算工具齐全,也得有人盯着。凌晨三点撞墙,没人帮你切。
所以我想要的效果很简单:账号在撞墙之前自己轮到下一个有余量的号,我照常打字,全程无感;然后随时能看见每个号还剩多少。就跟手机从 Wi-Fi 切到蜂窝差不多,电话该打着还打着。
两个工具,各管一半
我搞了两个东西:
- clauth(我的 fork) — 终端里的账号管理 + 一个后台 daemon。管多账号登录、在活跃 session 底下热切换、按链自动轮换。rust 写的,热切换、浏览器登录这几个核心能力已经合回了上游项目。
- ccsbar(Claude Code Switcher Bar)— 原生 SwiftUI 的菜单栏 app,相当于 daemon 的仪表盘。每个账号的 5h / 7d / fable 用量条、下一步的预报、一键切换、登录挂了给红牌。它自己不碰任何凭据,只读 daemon 的状态、调 daemon 的接口。
下面按痛点一个一个讲。
热切换,session 不掉线
先讲让整件事成立的那个机制。macOS 上的 claude code 每次请求都会从系统钥匙串重新读一遍登录,读的是 Claude Code-credentials 这一个条目。不是启动的时候读一次揣在内存里,是每次请求都重新读一遍。这个行为文档里没写,是我自己验出来的。
所以只要改写那一个钥匙串条目,就能在活跃 session 底下把账号整个换掉。不用重启、不用重新登录,下一个请求就已经是另一个账号的身份了,session 自己完全不知道发生了什么。
画成时序图大概是这样:
fork 里所有钥匙串写入都走苹果自带的 /usr/bin/security。原因是钥匙串的「始终允许」授权绑定在调用方二进制的签名上,走系统自带的稳定二进制,授权一次就永久有效,不会因为你重新编译就反复弹窗。
登录这边也配了一套浏览器 OAuth:clauth login <名字> 会打开浏览器,走一遍和 claude code 一样的 PKCE 认证,token 直接进 profile。加新号是这条命令,修复掉线的旧号也是这条命令(同名重跑就是原地重认证)。
自动轮换,撞墙之前就切走
clauth daemon 是个常驻的后台进程,每隔一会儿刷一遍每个账号的用量。你把账号排成一条 fallback 链,活跃账号的 5h 窗口一过阈值(默认 95%),它就沿着链找下一个有余量的号,改写钥匙串。没人看着,终端关着也行。你吃个午饭回来,可能已经在链上第三个号了,活儿照跑。
账号排成 fallback 链,活跃号撞到 95% 之前,daemon 自动沿链切到下一个有余量的号,死号被隔离出链。
几个细节都是真用出来的:
- 登录失效的账号(比如 refresh token 被吊销了),daemon 会把它隔离出链,绝不把一个死 token 写进钥匙串。这条很重要:死 token 一旦写进去,这台机器上每个正在跑的 claude 都会被登出,那比撞墙糟糕多了。
- 全链耗尽有兜底。可以指定一个兜底账号,所有号都满的时候停在它上面;或者开 wrap-off 模式,整个停掉,不再烧配额。
- 还有个可选的 burn-aware 模式,按你当前的消耗速率去投影:烧得猛就提前切,烧得慢就骑到接近 100% 再切。
装成 macOS LaunchAgent(仓库里有现成脚本),开机自启,之后这件事就不需要你参与了。
把状态摆在明面上
后台自动换号的进程有个问题:坏了你不知道。daemon 死了,数字冻住,看着还像活的。凌晨它切过一次号,你也不知道现在跑在哪个号上。还有登录悄悄过期这种情况,缓存的数字照常显示,看着一切正常。反正这些事它自己都清楚,就是你看不见。
ccsbar 干的就是把这些全摆出来:
- 每个账号 5h / 7d / fable 三条用量条加重置倒计时,实时刷新。
- 面板顶上那句「Watching account-1 — would switch to account-2 at 95%」不是 UI 自己猜的,是 daemon 把自己下一步的决策直接发布出来,UI 只负责显示,所以预测和实际行为永远一致。
- 无人值守的轮换发生时,菜单栏会闪八秒「⇄ 已切到 personal」;手动切换在面板里两步完成(点开账号、点 Use),成功失败都有明确反馈。
- daemon 停了,整个面板变灰,盖上「4 分钟前冻结」的戳;某个账号登录失效,给红牌加一个「Log in again」按钮,点了直接拉起浏览器重认证。
daemon 的每个静默故障(冻结、切换、掉登录)都被 ccsbar 拽到菜单栏上,给一个响亮固定的显示。
ccsbar 面板(深色模式):三个账号的用量条、预报、fallback 链
ccsbar 面板(浅色模式)
快速上手
# clauth(我的 fork)
git clone https://github.com/xingfanxia/clauth
cd clauth && cargo install --path .
clauth login work # 浏览器登录第一个号
clauth login personal # 第二个号
clauth # TUI 里把两个号加进 fallback 链、设阈值
# 守护进程(LaunchAgent 开机自启)
./dist/macos/daemon-install.sh
# ccsbar
git clone https://github.com/xingfanxia/ccsbar
cd ccsbar && ./Scripts/package_app.sh
cp -R build/ccsbar.app /Applications/ && open /Applications/ccsbar.app
第一次切换时 macOS 会弹一次钥匙串授权,选「始终允许」,之后就不会再问了。
用了几周
daemon 已经帮我轮了好些天号,我基本注意不到它。唯一一次注意到,是一句话打到一半的时候菜单栏闪了下「⇄ 已切到 personal」,然后活儿接着跑。
两个仓库都开着 issue:clauth fork / ccsbar。想看这套东西是怎么被搭出来的(包括那个每次请求重读钥匙串的机制是怎么验出来的),英文版 I Taught My Claude Accounts to Rotate Themselves 有完整的过程记录。


