问题描述#

哎呀,Codex 的配置有时候真的像出门前换装备:自己订阅能用,别人中转提供的密钥也能用,但两边配置一切换起来,就很容易手忙脚乱。

咱遇到的场景是:平时可能会用别人提供的密钥跑一些任务,但如果那边突然报错、额度不稳定,或者认证状态不对,就需要马上切回自己的订阅。手动改 ~/.codex/config.toml 和认证文件当然也可以,可是每次都打开文件、检查内容、再替换,太容易把自己绕晕啦。

盯 配置文件这种东西,错一个就要盯着终端发呆好久。

所以这里用一个小脚本来做切换:把当前正在使用的配置文件,和 .bak 结尾的备用配置互换。想切回来时,再运行一次脚本就行。

这篇里脚本实际切换的是:

  • ~/.codex/config.toml
  • ~/.codex/auth.json
  • ~/.codex/config.toml.bak
  • ~/.codex/auth.json.bak

如果你本地认证文件确实叫 auth.toml,那就把脚本里的 auth.json 改成自己的真实文件名。关键点不是扩展名,而是两套配置必须一一对应

准备两套配置#

脚本默认认为,~/.codex 目录下有两套文件:

~/.codex/config.toml
~/.codex/auth.json
~/.codex/config.toml.bak
~/.codex/auth.json.bak

可以把不常用的那套配置放在 .bak 文件里。比如当前正在使用别人提供的密钥,那么自己的订阅配置就可以先放在:

~/.codex/config.toml.bak
~/.codex/auth.json.bak

等要切回自己的订阅时,运行脚本,当前文件和 .bak 文件就会互换位置。

切换脚本#

脚本内容如下:

#!/usr/bin/env bash
set -euo pipefail

target_dir="$HOME/.codex"
pairs=("config.toml" "auth.json")
missing=0

for name in "${pairs[@]}"; do
  live="$target_dir/$name"
  backup="$live.bak"

  if [[ ! -f "$live" ]]; then
    echo "缺少文件: $live" >&2
    missing=1
  fi

  if [[ ! -f "$backup" ]]; then
    echo "缺少文件: $backup" >&2
    missing=1
  fi
done

if ((missing)); then
  echo "未切换。请先确认 config.toml、config.toml.bak、auth.json、auth.json.bak 都存在。" >&2
  exit 1
fi

tmp_dir="$(mktemp -d "$target_dir/.switch-config-auth.XXXXXX")"
cleanup() {
  if [[ -d "$tmp_dir" ]]; then
    rm -rf "$tmp_dir"
  fi
}
trap cleanup EXIT

for name in "${pairs[@]}"; do
  live="$target_dir/$name"
  backup="$live.bak"
  tmp="$tmp_dir/$name"

  mv "$live" "$tmp"
  mv "$backup" "$live"
  mv "$tmp" "$backup"
done

rmdir "$tmp_dir"
trap - EXIT

echo "已切换:"
for name in "${pairs[@]}"; do
  echo "  $name <-> $name.bak"
done

使用方法#

可以把脚本放在一个固定位置,比如:

~/.codex/switch-config-auth.sh

然后给它执行权限:

chmod +x ~/.codex/switch-config-auth.sh

需要切换时运行:

~/.codex/switch-config-auth.sh

如果输出类似下面这样,就说明切换完成了:

已切换:
  config.toml <-> config.toml.bak
  auth.json <-> auth.json.bak

再运行一次同一个脚本,就会把两套配置换回来。哼哼,这里就是最省心的地方:不用记当前是哪一套,只要知道“运行一次就是换到另一套”。

脚本做了什么#

这个脚本先检查四个文件是否都存在。只要缺一个,就直接停止,不做任何移动:

config.toml
config.toml.bak
auth.json
auth.json.bak

这样可以避免只换了一半,结果配置和认证文件对不上的情况。比如 config.toml 已经切过去了,但 auth.json 还停在旧密钥,那可就要开始和报错消息大眼瞪小眼了。

真正切换时,脚本会在 ~/.codex 里创建一个临时目录,把当前文件先挪进去,再把 .bak 文件挪到正式位置,最后把临时目录里的旧文件挪回 .bak

流程可以理解成这样:

config.toml      -> 临时目录
config.toml.bak  -> config.toml
临时目录里的旧文件 -> config.toml.bak

auth.json 也是同样的逻辑。两组文件都走完之后,临时目录会被清理掉。

注意事项#

  • 切换前确认两套配置都能正常使用,不要把空文件或者过期密钥放进 .bak
  • 如果 Codex 相关进程已经启动,并且已经读取了旧配置,切换后最好重新打开对应会话,让新配置重新生效。
  • 不要只切 config.toml,也不要只切 auth.json。订阅配置和认证状态要一起切,才不容易出现“看起来切了,其实没切干净”的问题。
  • 如果你的认证文件名不是 auth.json,记得同步修改脚本里的 pairs
自豪 一键切换成功!这种小脚本,平时不起眼,救急的时候可太可靠啦。
本站总访问量  ·  访客数
你的IP 获取中…