Перейти к содержанию

Claude Code

ccswitch переключает аккаунты Claude Code одной командой

6 мин чтения

Текст написан ИИ-моделью по источникам, на которые ведут ссылки, и сверен с ними второй моделью. Как мы работаем

Всё о теме: Claude Code: версии и изменения →
Изображение: github.com

Разработчик с ником 2hmad 4 сентября показал на Show HN утилиту ccswitch. Она переключает аккаунты Claude Code одной командой и подменяет при этом всего две вещи: OAuth-токены и запись о том, кому принадлежит вход. MCP-серверы, плагины, навыки, агенты, slash-команды, история сессий, settings.json и CLAUDE.md лежат в одном общем ~/.claude для всех аккаунтов.

Код и документация выложены в репозитории на Github под лицензией MIT. Для работы нужны bash, python3 и сам Claude Code. Linux поддержан, macOS помечен как экспериментальный, WSL должен вести себя как Linux, но его не тестировали. Ставится утилита скриптом install.sh через curl или вручную после git clone.

Две записи вместо целого каталога

Claude Code хранит состояние аккаунта в двух местах. В ~/.claude/.credentials.json лежат OAuth-токены, access и refresh. ~/.claude.json устроен сложнее: в одном файле и идентичность вошедшего пользователя, и MCP-серверы, и решения о доверии к проектам, и прочие настройки.

ccswitch заводит под каждый аккаунт папку ~/.config/ccswitch/accounts/<name>/ с двумя файлами. credentials.json хранит копию файла с токенами, а в identity.json попадают только ключи oauthAccount и userID из ~/.claude.json. При переключении утилита возвращает их на место и не трогает остальные ключи, поэтому mcpServers, projects и всё прочее остаются общими.

Claude Code обновляет токены прямо во время сессии. Если просто восстанавливать сохранённую копию, при следующем возвращении на аккаунт она окажется устаревшей. Поэтому перед уходом с аккаунта ccswitch записывает действующий токен обратно в его слот, а вручную то же делает ccswitch save.

Каждый аккаунт добавляется один раз: ccswitch login work открывает Claude Code, где нужно выполнить /login, а затем /exit. Если вы уже вошли под нужным аккаунтом, ccswitch add work заберёт его без нового входа. Дальше хватает ccswitch personal или ccswitch use personal, и следующий запуск claude идёт от имени personal. ccswitch list показывает имена, почту и сколько осталось жить каждому access-токену, вплоть до строки «expired 3h ago». Из остального есть rename, rm, backup и restore, а ccswitch doctor проверяет всю установку.

Чем это отличается от CLAUDE_CONFIG_DIR

Обычно аккаунты разводят через CLAUDE_CONFIG_DIR. Переменная указывает Claude Code другую папку вместо ~/.claude, второго бинарника при этом нет, и в каждой папке живут свои вход, хуки, навыки, MCP-серверы и CLAUDE.md. Автор ccswitch пишет, что при таком подходе всё дублируется и копии со временем расходятся. А если скопировать весь ~/.claude в каждый профиль целиком, туда, где им не место, могут переехать устаревшие MCP-серверы, старые хуки и не относящаяся к делу память.

У общей настройки есть цена: активен один аккаунт за раз, и это действует глобально. ccswitch меняет, от чьего имени запускается claude, во всех терминалах сразу. Кому нужны два аккаунта одновременно в разных окнах, тем автор сам советует остаться на CLAUDE_CONFIG_DIR. По той же причине ccswitch use не запускается, пока жив процесс claude, а флаг --force это ограничение снимает. Если CLAUDE_CONFIG_DIR задан, ccswitch работает с этой папкой, а не с ~/.claude, и doctor об этом предупредит. Настройки проекта от переключения не зависят: .mcp.json, .claude/settings.json и CLAUDE.md из репозитория загружаются при любом активном аккаунте.

Похожие инструменты уже есть, но устроены они иначе. claude-switch тоже сохраняет и подменяет учётные данные подписки командами save и use, но после переключения Claude Code приходится перезапускать. Он же снимает и восстанавливает целые профили конфигурации, требует Bun и заявляет поддержку macOS, Linux и Windows. Расширение Multi-Account Switcher for Claude Code для VS Code выставляет CLAUDE_CONFIG_DIR на каждое окно. В «общем» режиме оно подтягивает из ~/.claude через символические ссылки settings.json, CLAUDE.md, агентов, команды, навыки и плагины, а отдельным у аккаунта остаётся только вход. Сама Anthropic, как сообщал в августе Testing Catalog, готовит несколько аккаунтов в мобильных приложениях Claude.

Зачем держать несколько аккаунтов, каждый объясняет по-своему. Авторы claude-switch прямо ссылаются на лимиты Max: упёрся в потолок на одном аккаунте, переключился на другой и работаешь дальше. В руководстве AQ напоминают, что один аккаунт и так может держать много сессий Claude Code одновременно, а потребительские условия Anthropic запрещают делиться логином. Там же, как и в руководстве henggana, советуют не использовать несколько профилей для обхода правил аккаунтов и подписок. В примерах ccswitch фигурируют аккаунты work, personal и client.

Припаркованные аккаунты

Access-токен живёт около 8 часов, и у активного аккаунта Claude Code продлевает его сам. Аккаунты, отложенные в хранилище, никто не трогает. Их refresh-токен (долгоживущий ключ, по которому выдаются новые access-токены) примерно через 28 дней может истечь, и тогда придётся заново проходить ccswitch login <name> через браузер.

Для этого есть ccswitch refresh --all. Команда по очереди восстанавливает каждый сохранённый аккаунт, делает один крошечный API-вызов без инструментов, сохраняет обновлённый токен и возвращает вас на тот аккаунт, с которого вы начали. Аккаунты с ещё живым access-токеном пропускаются без всякого вызова: пока он действует, refresh-токену ничего не грозит. Квоту сессии это почти не расходует, а типичный запуск, по словам автора, вообще ничего не делает.

Обновление можно повесить на cron или на пользовательский таймер systemd. С cron автор предупреждает о двух ловушках. Первая связана с PATH: cron стартует с голым /usr/bin:/bin, а refresh нужны и ccswitch, и бинарник claude, который обычно лежит в ~/.local/bin. Без этого задача падает с сообщением, что команда claude не найдена в PATH. Вторая связана со временем: refresh отказывается работать, пока запущен claude, так что задача посреди сессии только запишет ошибку в лог. В примере из README она стоит на 4:30 утра. На ноутбуке автор советует systemd: с Persistent=true таймер наверстает запуск, пропущенный во время сна, а cron его просто пропустит. Чтобы таймер срабатывал, пока вы не вошли в систему, понадобится ещё loginctl enable-linger.

В хранилище лежат живые токены сессий, поэтому каталог ~/.config/ccswitch создаётся с правами 700, а файлы в нём с правами 600. ccswitch backup упаковывает эти токены в архив, и автор просит шифровать его, если он хранится где-то кроме вашего диска.

macOS через связку ключей

На macOS Claude Code держит OAuth-токены в связке ключей входа, а не в ~/.claude/.credentials.json, и ccswitch читает и пишет их там через security(1). Имя записи он выводит так же, как Claude Code. Сервис называется «Claude Code-credentials», и при заданном CLAUDE_CONFIG_DIR к нему добавляются первые восемь символов sha256 от пути к папке. Аккаунтом служит $USER, а если переменная пуста или содержит символы вне [a-zA-Z0-9._-], то claude-code-user.

Этот путь проверили только на заглушке, подставленной вместо security(1). На настоящей связке ключей и реальном железе он пока не подтверждён, отсюда и экспериментальный статус. При первом переключении macOS может запросить разрешение, потому что система не даёт новому бинарнику читать запись, которую создал не он. Автор советует выбрать Always Allow. Связка ключей используется, только когда нет ~/.claude/.credentials.json: если такой файл остался от старой версии Claude Code, приоритет у него. Выбрать бэкенд принудительно можно переменной CCSWITCH_BACKEND=keychain или CCSWITCH_BACKEND=file.

Переезд с отдельных папок

Если у вас уже несколько CLAUDE_CONFIG_DIR, README предлагает взять самую обжитую из папок и сделать её общим ~/.claude. Сначала снимите переменную и уберите её из ~/.zshrc, отложите старый ~/.claude, скопируйте выбранный профиль вместе с его .claude.json и заберите этот аккаунт командой ccswitch add work. Остальные аккаунты переносятся по одному: их .credentials.json кладётся в ~/.claude, короткий скрипт на Python копирует из их .claude.json только oauthAccount и userID, затем снова ccswitch add. В конце ccswitch list должен показать все аккаунты.

Пока никто не написал. Будьте первым.

Присоединяйтесь к разговору

Войдите, чтобы оставить комментарий. Он появится после модерации.