功能
管理账号
本页由英文机器翻译而来,欢迎指正。 在 GitHub 上编辑此页
每个 ccam 账号都是一个独立的 Claude Code 配置文件夹,拥有自己的登录。这些命令用于创建、登录、列出、重命名和删除账号,以及注册你已有的文件夹。
用法
ccam add # wizard on a terminal: name, shared items, shortcut, login
ccam add work --shortcut ccwork # no wizard: log in, then create the ccwork command
ccam add side --no-login --share history=team
ccam login side # run claude auth login inside the account
ccam logout side # remove the login token
ccam list # table of accounts; ccam ls is the same
ccam list --json # machine-readable
ccam use 2 # make slot 2 the default account
ccam rename side personal
ccam remove personal # asks, then moves the folder to the trash
ccam import # find ~/.claude and ~/.claude-* and ask about each
ccam import ~/.claude-ops --name ops
ccam completion zsh > "${fpath[1]}/_ccam"凡是命令接受 <name|number> 的地方,你都可以给出账号名或它的槽位号,即 ccam list 中的 # 列。
在终端中不带选项运行 ccam add 会打开向导。它先询问名称,然后显示共享项清单(除对话历史外都已勾选),接着询问 Create a shortcut command for work? [y/N],回答 y 后再询问 Shortcut name [ccwork]:。只要给出 --share、--shortcut 或 --no-login 中的任何一个,或者输入来自管道而不是终端,就会跳过向导;此时必须指定名称,并且除非 --shortcut 指定了名称,否则不会创建快捷命令。
ccam list 显示槽位、名称、快捷命令、邮箱、共享项和最近使用时间,默认账号前面标有 *:
$ ccam list
# Name Shortcut Email Shared Last used
* 1 work ccwork user@example.com mcp settings md ext -
2 personal - me@side.dev settings md ext history@team -使用 --json 时,每个账号是一个对象,包含 slot、shortcut、name、email、default、dir、last_used(账号从未启动过时省略)和 share。share 把每一项(mcp、settings、memory、extensions、history)映射到它的组名或 "local"。
选项
| 选项 | 作用 | 默认值 |
|---|---|---|
ccam add --no-login |
创建账号但不登录;之后用 ccam login <name> 登录 |
关闭 |
ccam add --share <item=group> |
与某个组共享一项,或用 item=local 保持私有。可重复使用 |
mcp、settings、memory、extensions 在 default 中;history 为本地 |
ccam add --shortcut <command> |
同时在 ~/.local/bin 中创建这个快捷命令 |
无 |
ccam list --json |
以 JSON 输出账号 | 关闭 |
ccam remove -y、--yes |
不询问直接删除 | 关闭 |
ccam import --name <name> |
你所指定文件夹的账号名 | 由文件夹名推导 |
ccam import -y、--yes |
不询问直接导入找到的所有文件夹 | 关闭 |
--dry-run |
ccam list 和 ccam completion 接受它,因为它们不做任何更改。add、login、logout、use、rename、remove 和 import 会拒绝它,并输出 --dry-run is not supported by `ccam add`; nothing was changed(其中是对应的命令名) |
关闭 |
ccam login、ccam logout、ccam use 和 ccam rename 没有自己的选项。ccam completion 接受 bash 或 zsh;其他值会失败并显示 only bash and zsh are supported。
账号名由 1 到 32 个 a-z、0-9、- 和 _ 字符组成,必须以字母或数字开头。名称不能全是数字,因为 ccam 2 表示槽位 2。名称也不能是 ccam 的命令(add、list、ls、run、use、next、usage、u、share、mcp、login、logout、rename、remove、rm、import、migrate、doctor、shims、shortcut、completion、help、version、statusline、update),这样 ccam <name> 永远不会有歧义。这份列表是 internal/config 中的 config.Reserved。
工作原理
ccam add work --shortcut ccwork 在 addProfile(internal/cli/profiles.go)中执行以下步骤:
- 在创建任何内容之前,
config.ValidateName检查名称,shim.Check检查快捷命令。 profile.Add以0700权限创建~/.local/share/ccam/profiles/work/,并为账号分配最小的空闲槽位号(Config.NextSlot),因此已删除账号的编号会被重复使用。第一个账号会成为默认账号。applyShare先用share.Build再用Apply,把新建的空文件夹链接到它的共享组,例如把settings.json链接到groups/default/settings.json。如果这一步失败,新文件夹会被删除,因为残留的文件夹会让每次重试都因folder already exists而失败。- 账号通过
fsutil.AtomicWrite保存到~/.config/ccam/config.toml:先写临时文件,执行fsync,再rename,因此即使崩溃也不会留下写了一半的配置。 runLogin在CLAUDE_CONFIG_DIR设为账号文件夹的情况下启动claude auth login。如果登录失败,账号仍会保留,ccam 会打印错误,并提示你稍后运行ccam login work。profile.ReadEmail从profiles/work/.claude.json中取出oauthAccount.emailAddress。这个文件可能有好几 MB,所以TopLevelValue只扫描这一个键,而不解析整个文件。shim.Install把~/.local/bin/ccwork链接到 ccam 可执行文件,后者启动时会在config.toml中查找argv[0]。
登录可能需要几分钟,期间另一个 ccam 可能会保存配置。因此需要等待的命令通过 env.update 保存:它重新加载 config.toml,只应用这一项更改(这里是邮箱),然后保存。出于同样的原因,ccam remove 在提示之后也会重新加载。
ccam login 对已有账号执行第 5 步和第 6 步。ccam logout 在账号中运行 claude auth logout 并清除保存的邮箱。ccam use 只改写 config.toml 中的 default。
在远程机器上登录
通过 SSH 连接时,claude auth login 中浏览器那一半可能会出问题。Claude Code 在服务器上的 http://localhost:<port>/callback 回调服务器上等待登录完成,但完成登录的浏览器运行在你的电脑上,在那里这个地址指向不了任何地方,浏览器会显示 ERR_CONNECTION_REFUSED 之类的错误。这个地址中仍带有一次性代码,所以 ccam 可以把它转交过去:
runLogin 不会把你的终端直接交给 Claude Code。它把 Claude Code 的标准输入连接到一个管道,由 relayLogin 把你输入的每一行复制进去,因此在 Claude Code 的 Paste code here 提示处粘贴的代码依然能送达。当某一行是回调地址时,callbackURL 只在以下条件都满足时才接受它:主机是 localhost、127.0.0.1 或 [::1],指定了端口,路径为 /callback,并且同时带有 code 和 state;http:// 可以省略。然后 deliverCallback 像浏览器那样,在服务器上请求这个地址,时限为 10 秒,且不跟随重定向。请求到达正在等待的 claude auth login 的回调服务器(图中的虚线)。Claude Code 收到代码并保存登录,在 Linux 上保存到账号文件夹中的 .credentials.json。粘贴的内容永远不会让 ccam 连接其他主机。
登录开始之前,ccam 会打印:
On a remote machine? If the browser ends on a http://localhost:…/callback page that does not load, paste that address here.成功时打印 → Passed the sign-in to Claude Code on this machine.
重命名、删除和导入
ccam rename 和 ccam remove 作用于账号的文件夹,以及 ccam 在其他位置以该账号名保存的内容。nameState 列出了这些路径:~/.local/state/ccam/last-used/<name>、~/.local/state/ccam/mcp/<name>,以及用量缓存 ~/.local/state/ccam/usage/<name>.json 和 <name>.statusline.json。ccam remove work 按以下顺序处理它们:
如果账号正在运行,ccam remove 会先拒绝,否则询问确认。如果账号共享扩展,RewritePluginPaths 会改写组中的 installed_plugins.json 和 known_marketplaces.json,因为 Claude Code 保存的是插件的绝对路径,这些路径可能经过该账号的文件夹。profile.Trash 把文件夹移到 ~/.local/share/ccam/trash/<name>-<time>/,账号从 config.toml 中移除,nameState 中的路径被删除,以免之后同名的账号继承它们,快捷命令的链接也会被删除。要恢复账号,把文件夹从回收站移回即可。
ccam rename 重命名文件夹,把其 plugins/ 中的插件路径从旧文件夹改写为新文件夹,保留默认账号设置,并把 nameState 中的路径移到新名称下。快捷命令保持原名。如果插件路径改写失败,文件夹会被改回原名,因为配置不会被保存。
ccam import 把文件夹在原位置注册为 config.toml 中的 dir。它从不移动或复制文件夹:复制的刷新令牌会让各个副本互相把对方登出。不指定文件夹时,它会查找尚未注册的 ~/.claude 和 ~/.claude-* 文件夹并逐个询问;名称取自文件夹(~/.claude 为 main,~/.claude-work 为 work,~/.claude-2 为 acct2),无法推导名称的文件夹会被列出,并附上应使用的 --name 命令。没有 CLAUDE_CONFIG_DIR 时,Claude Code 把 .claude.json 放在你的主目录中、~/.claude 旁边,因此当你导入 ~/.claude 而它没有自己的 .claude.json 时,ccam 会创建链接 ~/.claude/.claude.json,指向 ~/.claude.json。这样直接运行 claude 和运行 ccam main 看到的是同一个账号。导入的账号在你运行 ccam share 之前不共享任何内容,也不会创建快捷命令。
ccam completion bash|zsh 会打印一个补全脚本,它也能补全账号名。
安全性与边界情况
- 账号运行时,
ccam rename和ccam remove会拒绝执行(refuseRunning),并显示work is running; quit its Claude Code session first,因为会话会继续写入该文件夹。 - 对导入的账号执行
ccam remove只会取消注册:✓ main unregistered (folder ... left in place)。你的~/.claude不会被移到回收站。 - 如果
profiles/中已存在同名文件夹,ccam add会拒绝该名称,并提示使用ccam import。 ccam import会拒绝已注册的文件夹、不是文件夹的路径,以及已被占用的名称。ccam logout和ccam login不检查账号是否正在运行。- 如果转交无法到达 Claude Code(例如登录已经结束),它会打印
ccam: could not pass the sign-in to Claude Code:以及原因。HTTP 错误通常表示代码已过期;请重新开始登录。