我让我的几个 Claude 账号自己换着用了
五小时墙,和比墙更烦的切号
天天泡在 Claude Code 里的人都懂那堵墙。你正写在兴头上,方案眼看要落地,五小时用量窗口悄没声地满了,一切停摆,等重置。
手里有多个号的人(一个个人 Max、一个工作 Max)第一反应是切号。但 macOS 上切号的真实体验是这样的:
- 切号等于重新登录。走一遍浏览器认证,正在跑的会话丢登录,你丢掉刚才的位置。
- 改配置文件没用。你以为改
~/.claude/.credentials.json就能换号?它只是个镜像,改了对运行中的会话毫无影响。市面上的切号工具大多在改这个文件,在 macOS 上等于装饰。 - 你不知道每个号还剩多少。哪个号的 5h 窗口快满了、哪个号的登录悄悄过期了,没有任何地方告诉你。等你发现,往往是会话报错的那一刻。
- 就算工具齐全,也得有人盯着。凌晨三点撞墙,没人帮你切。
我想要的是这件事最无聊的版本:账号在撞墙之前自己轮到下一个有余量的,我照常打字,全程无感;随时抬头能看见每个号的余量。像手机从 Wi-Fi 切到蜂窝网,电话不断。
两个工具,各管一半
- clauth(我的 fork) — 终端里的账号管家 + 一个无人值守的后台 daemon。管多账号登录、在活跃会话底下热切换、按链自动轮换。Rust 写的,其中热切换、浏览器登录等几个核心能力已经合回了上游项目。
- ccsbar(Claude Code Switcher Bar)— 原生 SwiftUI 菜单栏 app,daemon 的仪表盘。每个账号的 5h / 7d / Fable 用量条、下一步预报、一键切换、登录健康红牌。它自己不碰任何凭据,只读 daemon 的状态、驱动 daemon 的接口。
下面按痛点逐个说怎么解决的。
解法一,真正的热切换,会话不掉线
先说那个让一切成立的机制,因为哪儿都没写,我是亲手验出来的:macOS 上的 Claude Code 每次请求都从系统钥匙串重读登录,读的是 Claude Code-credentials 这一个条目。不是启动时读一次揣在内存里,是每次请求都读。
所以改写那一个钥匙串条目,就能在活跃会话底下把账号整个换掉。不重启、不重新登录,下一个请求悄没声地就以另一个账号的身份认证了。会话自己根本不知道。
画成时序图就是:
fork 里所有钥匙串写入都走苹果自带的 /usr/bin/security,因为钥匙串的「始终允许」授权绑定在调用方二进制的签名上,走系统自带的稳定二进制,授权一次就永久有效,不会因为重新编译反复弹窗。
配套的还有一个自带的浏览器 OAuth 登录:clauth login <名字> 打开浏览器走一遍和 Claude Code 一样的 PKCE 认证,token 直接进 profile。加新号、修复掉线的旧号(同名重跑就是原地重认证),都是这一条命令。
解法二,无人值守自动轮换,撞墙之前就切走
clauth daemon 是个常驻后台进程,每隔一会儿刷一遍每个账号的用量。你把账号排成一条 fallback 链,活跃账号的 5h 窗口一过阈值(默认 95%),它就沿链走到下一个有余量的号,改写钥匙串。没人看着,终端关着。你吃个午饭回来,人已经在链子下游第三个号上了,活儿照跑。
几个细节是真用出来的:
- 死号绝不上岗。一个登录悄悄失效的账号(refresh token 被吊销之类),daemon 会把它隔离出链,绝不把死 token 装进钥匙串。否则一次自动切换会把这台机器上每个正在跑的 claude 全部登出,那比撞墙糟糕多了。
- 全链耗尽有兜底。可以指定一个「兜底位」账号,所有号都满时停到它上面;或者开 wrap-off 模式,整个停掉不再烧配额。
- 按需更聪明。可选的 burn-aware 模式按你当前的消耗速率投影,烧得猛就提前切,烧得慢就骑到接近 100% 再切。
装成 macOS LaunchAgent(仓库里有现成脚本),开机自启,从此这件事不需要你参与。
解法三,把一切摆在明面上
后台自动帮你换号的进程有个特有的失败方式:沉默地坏掉。daemon 死了,数字冻住但看着还像活的;凌晨切了一次号,你不知道现在在哪个号上;某个登录过期了,缓存数字照常显示。每一种都是系统知道一件你不知道的事。
ccsbar 的设计原则就一条:daemon 的每个状态都要有一个响亮的、看得见的落点。
- 余量一眼可见。每个账号的 5h / 7d / Fable 三条用量条加重置倒计时,实时刷新。
- 预报是 daemon 亲口说的。面板顶上那句「Watching account-1 — would switch to account-2 at 95%」不是 UI 猜的,是 daemon 把自己下一步的决策直接发布出来,UI 只负责念。预测和实际行为永远一致。
- 切号有回执。无人值守的轮换发生时,菜单栏闪八秒「⇄ 已切到 personal」;手动切换也在面板里两步完成(点开账号、点 Use),有明确的成功/失败反馈。
- 坏消息不装死。daemon 停了,整个面板变灰并盖上「4 分钟前冻结」的戳;某个账号登录失效,红牌加一键「Log in again」,点了直接拉起浏览器重认证。
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 保留了完整的过程记录。