同时维护个人项目和工作项目的时候,最让我头疼的不是代码本身,而是工具的账号管理。[[Claude Code]] 和 [[Codex]] 这类 AI 编程工具,我在公司有一套账号,个人订阅又是另一套。每次在项目之间切换,都要 claude auth logoutclaude auth login,不仅耗时,还经常忘了当前用的是哪个账号,写了半天才发现额度消耗到错误的账号上去了。

这个问题在社区里也有不少人反映。[[Claude Code]] 的 GitHub issue #261 从 2025 年初提出原生 multi-account 支持,到现在积累了几十个 upvote,还有一个 issue 描述有人花了 40 分钟才搞定账号切换,可见这不是个小众需求。好消息是,虽然官方没有内置完善的 profile 系统,社区已经摸索出了几套成熟的方案。

在两个终端窗口中同时运行不同账号的 Claude Code

Claude Code 的账号存储机制

在讨论切换方案之前,先理解 Claude Code 的认证数据存在哪里。默认情况下,所有配置、认证 token、会话历史都存放在 ~/.claude/ 这一个目录里。这个目录结构大致如下:

~/.claude/
├── settings.json          # 配置文件(不含凭证)
├── sessions/              # 会话历史
├── plugins/               # 插件数据
└── cache/                 # 缓存

OAuth token 通过 claude auth login 登录后存储在系统中,与 ~/.claude/ 绑定。切换账号的本质,就是让 Claude Code 指向一个不同的配置目录,从而读取不同账号的认证数据。

[[Claude Code]] 支持一个关键环境变量:CLAUDE_CONFIG_DIR,它允许你指定 Claude Code 使用的配置目录,而不是默认的 ~/.claude/。一切账号切换方案都围绕这个环境变量展开。

Claude Code 切换方案

直接使用环境变量(最简单)

最直接的方式是在启动 Claude Code 时临时指定配置目录:

# 使用工作账号
CLAUDE_CONFIG_DIR=~/.claude-work claude

# 使用个人账号
CLAUDE_CONFIG_DIR=~/.claude-personal claude

第一次用某个目录启动时,Claude Code 会自动创建该目录并引导你登录,之后该目录就保存了那个账号的认证信息。这种方式零依赖,但每次都要手动输入变量名,比较麻烦。

Shell 函数封装(推荐的手动方案)

把环境变量封装进 Shell 函数,添加到 ~/.zshrc~/.bashrc 里,就能用简短命令切换:

claude() {
  local profile="personal"
  local claude_args=()

  while [[ $# -gt 0 ]]; do
    case $1 in
      -p|--profile)
        if [[ -n "$2" && "$2" != -* ]]; then
          profile="$2"
          shift 2
        else
          echo "Error: -p requires a profile name" >&2
          return 1
        fi
        ;;
      *)
        claude_args+=("$1")
        shift
        ;;
    esac
  done

  echo "Claude Code profile: $profile"
  CLAUDE_CONFIG_DIR="$HOME/.claude-$profile" command claude "${claude_args[@]}"
}

这样就可以用 claude -p work 启动工作账号,claude 不带参数则用个人账号(默认值 personal)。这个方案来自社区,简洁有效,缺点是第一次设置需要手动登录每个 profile。

这里有一个注意点:CLAUDE_CONFIG_DIR 需要绝对路径,写 ~/.claude-work 在某些上下文下可能无法展开,用 $HOME 更安全。

claude-switch 工具(功能最完整)

claude-switch(GitHub: Abhishek21k/claude-switch)是一个专门为 Claude Code 多账号设计的工具,核心命令是 cswitch

# 安装(npm 或 brew)
npm install -g claude-switch

# 把当前已登录的账号保存为 work profile
cswitch add work

# 登录一个新账号并保存为 personal profile
cswitch login personal

# 使用某个 profile 启动 Claude
cswitch use work
cswitch use personal

# 查看所有 profiles
cswitch list

# 打开交互式 TUI 菜单
cswitch

它的机制和上面的 Shell 函数一样,本质上都是把 profiles 存在独立目录(~/.claude-switch/profiles/<name>/),切换时通过 CLAUDE_CONFIG_DIR 告诉 Claude Code 用哪个。工具的亮点在于:第一次运行时会检测你当前已登录的 session,可以选择直接复制而无需重新登录;支持同时在不同终端窗口运行不同账号;支持把常用 profiles 设置为 Shell alias(比如 claude-workclaude-personal)。

macOS 上认证 token 存储在 Keychain 里,每个 profile 完全隔离。

direnv 按目录自动切换(最适合多客户场景)

如果你同时服务多个客户或多个团队,每个客户的项目放在不同目录下,direnv 方案可以做到进入目录就自动切换账号,无需任何手动操作:

~/personal/.envrc           ← 个人项目父目录
~/personal/blog/
~/personal/open-source/
~/work/company/.envrc       ← 公司项目父目录
~/work/company/webapp/
~/clients/acme/.envrc       ← 客户 Acme 项目父目录
~/clients/acme/api/

每个 .envrc 文件只需一行:

# ~/personal/.envrc
export CLAUDE_CONFIG_DIR="$HOME/.claude-profiles/personal"

# ~/work/company/.envrc
export CLAUDE_CONFIG_DIR="$HOME/.claude-profiles/org/company"

# ~/clients/acme/.envrc
export CLAUDE_CONFIG_DIR="$HOME/.claude-profiles/clients/acme"

安装 direnv 并允许这些 .envrc 文件后(direnv allow),每次 cd 进某个目录,对应的 CLAUDE_CONFIG_DIR 就会自动生效,离开目录时自动还原。这个方案还有一个额外的好处:MCP 服务器的认证信息也跟着隔离了,不同客户的 GitHub、Slack、Linear 凭证不会互相混淆。

Codex CLI 的账号存储机制

[[Codex]] CLI 的认证存储比 Claude Code 更直接:~/.codex/auth.json 这个文件就是当前账号的全部认证数据,包含 OAuth token 或 API key。~/.codex/config.toml 是配置文件,支持 profiles 功能(通过 -p 参数选择)。

~/.codex/
├── auth.json              # 当前认证(权限 600)
├── backup_auth.json       # 认证备份
├── config.toml            # 配置文件
└── sessions/              # 会话历史

理解了这个结构,切换方案就很清晰了:只要把不同账号的 auth.json 保存起来,需要时替换,就完成了切换。

Codex CLI 切换方案

codex-profiles 工具

codex-profiles 是一个专门管理 Codex CLI 账号的工具,把切换 auth.json 的操作封装成简洁命令:

# 安装
npm install -g codex-profiles

# 保存当前账号为 work
codex-profiles save --label work

# 保存当前账号为 personal
codex-profiles save --label personal

# 查看所有 profiles
codex-profiles list

# 加载 work 账号
codex-profiles load --label work --force

Profiles 存储在 ~/.codex/profiles/ 目录下,每个 profile 就是一份 auth.json 的副本。切换时 load 命令把对应的 auth.json 复制覆盖到 ~/.codex/auth.json,下次启动 codex 就会使用那个账号。数据完全本地,不会上传到任何地方。

内置 –auth-profile 参数

Codex CLI 在较新版本(commit 2ac14d1)添加了内置的 --auth-profile 参数,专门为 multi-account 场景设计:

# 用指定 auth profile 启动
codex --auth-profile work

# 登录并保存为指定 profile
codex login --auth-profile personal

这是官方原生方案,如果你的 Codex CLI 版本足够新,优先使用这个。用 codex --version 确认版本,然后 codex --help 看看 --auth-profile 是否出现在参数列表里。

环境变量方案

对于使用 API key 认证的场景(推荐用于 CI/CD 或脚本化工作流),最简洁的方式是直接通过环境变量切换:

# 个人账号
export OPENAI_API_KEY="sk-personal-xxxx"
codex

# 工作账号
export OPENAI_API_KEY="sk-work-xxxx"
codex

结合 direnv 同样可以实现进入项目目录自动切换 API key,适合多项目环境。

限制与注意事项

几个使用时需要留意的地方:

对于 Claude Code,CLAUDE_CONFIG_DIR 的隔离并不是百分之百完整。~/.claude/CLAUDE.md 这个全局指令文件,无论 CLAUDE_CONFIG_DIR 指向哪里,都会被加载。此外 ~/.local/state/claude/ 这个状态目录在所有 profiles 间共享,IDE 插件(如 JetBrains)可能也存在兼容性问题。但最关键的认证数据和会话历史是完全隔离的,日常切换已经够用。

对于 Codex,codex-profiles 导出的 bundle 文件包含认证 token,妥善保管,不要提交到 Git 或存放在共享位置。

最后

Claude Code 目前最成熟的方案是 cswitch 工具加上 Shell 函数封装,两者都基于 CLAUDE_CONFIG_DIR 环境变量,原理清晰、易于理解和排障。如果你经常在多个客户项目之间切换,direnv 方案可以彻底解放双手,进目录即自动切换,离开即还原。Codex CLI 则优先看你的版本是否支持内置的 --auth-profile 参数,不支持的话 codex-profiles 是很好的替代选择。

这些方案的共同思路都是:不修改官方工具本身,而是通过环境变量或配置目录隔离来实现多账号共存。一旦理解了这个核心机制,遇到其他 CLI 工具需要多账号切换时,也可以举一反三地应用。