写了个脚本管理多个 Claude Code 账户?我放弃了,因为我翻车了
· 阅读约 4 分钟
凌晨两点,我盯着一条报错看了半天,第一反应是“这工具 bug 了吧”。仔细一查,画外音:是我对 macOS 的文件系统太天真。
起因很简单——工作一个 Claude Code 账户,自己练手又一个,每次切换都得登出、重走一遍 OAuth、再等它把新凭据落盘。三五次我就烦了,脑子里冒出“回头自己写个小脚本”的计划。然后在 GitHub 逛到 hamzarehmandeveloper 的 claude-account——对,就是 github.com/hamzarehmandeveloper/claude-account,68 个 star、12 个 fork,MIT 协议的独立小项目。它把话说在前头:不是 Anthropic 做的,也不是 Anthropic 认可或支持的。冲这句老实交代,我点了进去。
打住,还是介绍下这工具。它让你一个系统里跑多个 Claude Code 账户,每个账户独立配置和凭据目录,切换时把命令透明转发给官方 Claude 可执行文件。本质是个 shim,不替换官方二进制,只负责算好该给哪个 profile 开扇门。
claude account add work
claude account use work
claude account current
三个命令,日常够用。remove 也支持,带 --purge --yes 才彻底删 profile 的本地数据。
哦对,GitHub 上还有个名字很像的项目,claude-account-macos,Kerber0ss 写的,我差点搜串。两个项目不是一回事——claude-account 能读 claude-account-macos 创建的 OAuth profile,但 API-key profile 不导入,密钥一概不读不迁。
我最初警惕的是它的凭据处理。任何工具只要碰“帮你管登录”,第一件事就是翻源码看它读不读你的 token。翻完的结果是:状态文件只存 profile 名称、目录路径、真实 Claude 可执行文件路径,token 一概不碰。它只是把 CLAUDE_CONFIG_DIR 和 CLAUDE_SECURESTORAGE_CONFIG_DIR 指向同一个私有 profile 目录,让每个 profile 有独立的 Keychain 登录凭据。登录、token 刷新、安全存储,全由官方 Claude Code 自己完成。
这个设计让我放下心来。它明确知道自己的边界:只切目录,不碰密钥内容。
再往下看,它比我预想还谨慎。wrapper 会主动把 ANTHROPIC_API_KEY、ANTHROPIC_AUTH_TOKEN、CLAUDE_CODE_OAUTH_TOKEN 从子进程环境里移除,免得外部环境变量覆盖 profile 的认证。你以为它会“顺手”复用你设置好的 key?不,它先替你清干净,再让 profile 自己的认证生效。除非设 CLAUDE_ACCOUNT_PRESERVE_AUTH_ENV=1 显式说保留。
这种多此一举的耿直,我挺喜欢。它不像我见过的那种什么都想插一手的实习生——那个“实习生”会自作主张替你把所有抽屉都打开,翻出可能不该用的东西。
说回翻车。macOS 默认文件系统不区分大小写,profile 名这种情况下必须唯一,否则出现大小写冲突,普通命令直接失败,得用 resolve-case-collision 恢复。我看完文档只能沉默——这锅甩不到工具头上,是我对 macOS 太天真。
另一个点:切换账户只影响之后新启动的 Claude 进程。已经在跑的会话继续用启动时的账户。我一开始以为 use 对所有终端会话全局生效,差点在一个挂着旧账户的会话里操作生产数据。这不算工具的锅,纯粹是我没读文档就上手的老毛病。
还有一件事让它在我这里信任分再涨一截。macOS 上同时检测到 XDG 风格和 Application Support 风格的状态文件时,它不猜哪个是对的,直接失败,提示你用 CLAUDE_ACCOUNT_HOME 显式指定。遇到模糊就停下来问,而不是猜一个让你在数据里抓瞎——写代码这些年,我见过太多自作聪明的工具在歧义面前赌一把,赌输了连回滚的辙都没留。这个 68 star 的小工具选择了不猜,我为此愿意给它写这么多字。
签名?发布归档带了 SHA-256 校验,但没签名、没公证,macOS Gatekeeper 可能拦你。官方建议从源码构建,别绕过警告。我照做了,cargo build --locked --release 一路过,没波折。一个把“别绕过警告”写进文档的项目,至少知道自己在跟什么打交道。
想从头核对我说的话?仓库在 github.com/hamzarehmandeveloper/claude-account,不用信我,翻源码就行。
两小时用下来,那个手写脚本的计划彻底搁置了。倒不是因为它多完美——切换只对新进程生效、大小写冲突、未公证的发布包,都是实打实的坑——而是它把“我能做什么、我不碰什么”圈得清清楚楚,剩下的坑全是生态和系统本身,不是它制造出来的。
本期缴税:我花了一下午才发现,我试图在脚本里替它做的事,它早就替我做完了,而且做得比我干净。
评论
还没有评论,写下第一条讨论。