问题描述#
哎呀,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.bakauth.json 也是同样的逻辑。两组文件都走完之后,临时目录会被清理掉。
注意事项#
- 切换前确认两套配置都能正常使用,不要把空文件或者过期密钥放进
.bak。 - 如果 Codex 相关进程已经启动,并且已经读取了旧配置,切换后最好重新打开对应会话,让新配置重新生效。
- 不要只切
config.toml,也不要只切auth.json。订阅配置和认证状态要一起切,才不容易出现“看起来切了,其实没切干净”的问题。 - 如果你的认证文件名不是
auth.json,记得同步修改脚本里的pairs。
一键切换成功!这种小脚本,平时不起眼,救急的时候可太可靠啦。