功能
管理帳號
本頁由英文機器翻譯而成,歡迎提供修正。 在 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 為 local |
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 執行檔;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.json 的連結 ~/.claude/.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 錯誤通常表示代碼已過期;請重新開始登入。