让 Codex 走 Clash 代理

一键脚本

下面的脚本会同时完成两件事:写入终端代理环境变量,并生成一个带固定 Chromium 代理参数的 Codex Proxy.app

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/bin/zsh
set -eu

PROXY_PORT="7890"                    # Clash Verge 本地代理端口
SHELL_RC="$HOME/.zshrc"              # macOS 默认是 zsh;若仍使用 bash,改为 ~/.bashrc 或 ~/.bash_profile
CODEX_APP="/Applications/Codex.app"  # Codex.app 的实际安装路径
APP_NAME="Codex Proxy"               # 打包后显示的应用名称
LAUNCHER_SCRIPT="$HOME/Desktop/codex-proxy-launcher.applescript"  # 原始启动器脚本
APP_PATH="/Applications/${APP_NAME}.app"

BLOCK_START="# >>> codex proxy >>>"
BLOCK_END="# <<< codex proxy <<<"
TMP_FILE="$(mktemp)"

touch "$SHELL_RC"

awk -v start="$BLOCK_START" -v end="$BLOCK_END" '
  $0 == start {skip=1; next}
  $0 == end {skip=0; next}
  !skip {print}
' "$SHELL_RC" > "$TMP_FILE"
mv "$TMP_FILE" "$SHELL_RC"

cat >> "$SHELL_RC" <<EOF
$BLOCK_START
export HTTP_PROXY="http://127.0.0.1:${PROXY_PORT}"
export HTTPS_PROXY="http://127.0.0.1:${PROXY_PORT}"
export ALL_PROXY="socks5://127.0.0.1:${PROXY_PORT}"
export NO_PROXY="localhost,127.0.0.1,::1"
$BLOCK_END
EOF

cat > "$LAUNCHER_SCRIPT" <<EOF
on run
	do shell script "open -na " & quoted form of "$CODEX_APP" & " --args --proxy-server=" & quoted form of "http://127.0.0.1:${PROXY_PORT}" & " --proxy-bypass-list=" & quoted form of "localhost;127.0.0.1;[::1]"
end run
EOF

osacompile -o "$APP_PATH" "$LAUNCHER_SCRIPT"

echo "已写入 $SHELL_RC"
echo "已生成 $LAUNCHER_SCRIPT"
echo "已编译 $APP_PATH"
echo "如需让当前终端立即读取新配置,可执行: source $SHELL_RC"

前提

macOS 默认 shell 为 zsh。是否安装 Oh My Zsh 不影响本文命令,配置文件仍然是 ~/.zshrc。只有仍在使用 bash 时,才需要将脚本中的 SHELL_RC 改为 ~/.bashrc~/.bash_profile

执行脚本前,先确认 Clash 已启动,且目标端口处于监听状态:

1
lsof -nP -iTCP:7890 -sTCP:LISTEN

如果端口不是 7890,直接修改脚本顶部的 PROXY_PORT 即可。

变量说明

PROXY_PORT 用于统一控制终端环境变量和桌面版 Codex 的代理端口。

SHELL_RC 指向 shell 配置文件。使用 zsh 时为 ~/.zshrc,使用 bash 时改为 bash 对应文件。

APP_NAMEAPP_PATH 控制打包后的应用名称。例如改成 Codex Clash 后,生成结果就会变成 /Applications/Codex Clash.app

LAUNCHER_SCRIPT 是原始 AppleScript 文件。后续若只需要调整桌面启动参数,直接修改这个文件并重新编译即可。

脚本做了什么

脚本先在 SHELL_RC 中写入一段受标记保护的代理配置。再次执行时,会先移除旧的受管区块,再写入新的区块,避免重复追加。

随后会生成一个 AppleScript 启动器,并通过 osacompile 打包成 .app。这个启动器实际执行的仍然是:

1
2
3
open -na "/Applications/Codex.app" --args \
  --proxy-server="http://127.0.0.1:7890" \
  --proxy-bypass-list="localhost;127.0.0.1;[::1]"

环境变量负责终端中的 Codex CLI,启动参数负责桌面版 Codex。系统代理和 TUN 模式可以保持关闭。

验证

若脚本刚执行完成,当前终端需要手动读取一次新配置:

1
source ~/.zshrc

终端代理可以通过以下命令检查:

1
2
echo $HTTPS_PROXY
curl -I https://www.google.com

桌面版 Codex 启动后,可直接检查实际进程参数:

1
ps axww -o pid=,command= | grep "/Applications/Codex.app/Contents/MacOS/Codex" | grep -- "--proxy-server"

如果看到类似下面的输出,说明代理参数已经传入实际运行进程:

1
27415 /Applications/Codex.app/Contents/MacOS/Codex --proxy-server=http://127.0.0.1:7890 --proxy-bypass-list=localhost;127.0.0.1;[::1]

后续调整

代理端口变更时,直接修改脚本开头的 PROXY_PORT,然后重新执行整段脚本即可。这样会同时更新 SHELL_RC 和桌面启动器。

如果只需要更换打包后的应用名称,修改 APP_NAME 后重新执行即可。

如果只需要重建桌面启动器,也可以单独重新编译:

1
2
APP_NAME="Codex Proxy"
osacompile -o "/Applications/${APP_NAME}.app" "$HOME/Desktop/codex-proxy-launcher.applescript"

.app 本身只是打包产物,不需要在包内部单独维护配置。当前打包结果仍使用默认 applet 图标,本文仅覆盖功能性封装。

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy