[Codex] 经验分享:如何让 Codex Desktop 启动 ssh 服务器上的 session 的时候传入环境变量

TL;DR :Codex Desktop App 的 Remote SSH 目前不会继承远端 shell 环境变量,但可以通过包一层 codex 启动脚本,把 http_proxy 、 CODEX_HOME 等变量显式注入进去。 众所周知,Codex Desktop App 已经更新了原生 Remo...
[Codex] 经验分享:如何让 Codex Desktop 启动 ssh 服务器上的 session 的时候传入环境变量
[Codex] 经验分享:如何让 Codex Desktop 启动 ssh 服务器上的 session 的时候传入环境变量

TL;DRCodex Desktop App 的 Remote SSH 目前不会继承远端 shell 环境变量,但可以通过包一层 codex 启动脚本,把 http_proxyCODEX_HOME 等变量显式注入进去。

众所周知,Codex Desktop App 已经更新了原生 Remote SSH 支持。理论上,这意味着我们可以直接在桌面端连接远程机器,在远端继续已有的 Codex 会话,直接开始 Vibe Coding 。

但国内面临环境需要解决代理问题。Codex Desktop 连接到远端后,虽然能发现已有会话,但启动环境并不等价于手动启动 Codex CLI 的环境。

比如:

  • HTTP_PROXY / HTTPS_PROXY / ALL_PROXY 这类代理环境变量没有按预期继承;
  • 如果平时单独设置了 CODEX_HOME ,Codex Desktop Remote 也不一定会使用;

手动 SSH 上去,设置代理、切换 CODEX_HOME 、再启动 codex ,一切正常;但 Codex Desktop 自己连上去后,启动出来的 remote app-server 环境却不对。

经过一番 wrapper 嗅探,最终发现 Codex Desktop Remote 的远端启动流程大致是这样的:

1. ssh 到远端
2. 执行:/bin/sh -c 'PATH="${CODEX_INSTALL_DIR:-$HOME/.local/bin}:$PATH"; export PATH; codex --version'
3. 如果 codex --version 成功,再执行:
   codex app-server --listen unix://
   codex app-server proxy

这里最关键的是这一句: bash PATH="${CODEX_INSTALL_DIR:-$HOME/.local/bin}:$PATH" 的意思是:

  • 如果远端环境里设置了 CODEX_INSTALL_DIR ,就把这个目录放到 PATH 最前面;
  • 如果没设置,就默认把 $HOME/.local/bin 放到 PATH 最前面;
  • 然后再执行 codex --version 和 codex app-server ...。

这就给了我们一个非常干净的切入点。

解决思路

无须污染日常 shell 的 PATH ,也不需要定制修改真实的 codex 的 bin 文件,只设置一个 CODEX_INSTALL_DIR ,让 Codex Desktop Remote 自己临时命中我们的 wrapper ,也就是很久以前对 VS Code 的 Codex 插件做 wrapper 一样。

先在远端确认真实 codex 路径:

command -v codex 

假设输出是:

bash /path/to/real/codex 

然后新建一个 Desktop 专用 wrapper 目录:

bash mkdir -p ~/.codex-desktop-bin 

写一个同名 wrapper:

cat > ~/.codex-desktop-bin/codex <<'EOF'
#!/usr/bin/env bash

REAL_CODEX="/path/to/real/codex"

# 只在 Codex Desktop Remote 真正启动 app-server 时切换环境
if [ "${1:-}" = "app-server" ]; then
  export CODEX_HOME="$HOME/.codex-api"

  export HTTP_PROXY="http://127.0.0.1:7890"
  export HTTPS_PROXY="http://127.0.0.1:7890"
  export ALL_PROXY="socks5://127.0.0.1:7890"

  export NO_PROXY="localhost,127.0.0.1,::1,*.local,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,100.64.0.0/10"
fi

# 避免真实 codex 进程继续看到这个 Desktop 专用变量
unset CODEX_INSTALL_DIR

exec "$REAL_CODEX" "$@"
EOF

chmod +x ~/.codex-desktop-bin/codex

然后在远端 shell profile 里只设置:

export CODEX_INSTALL_DIR="$HOME/.codex-desktop-bin" 

注意,不要写:

export PATH="$CODEX_INSTALL_DIR:$PATH" 

因为我们并不想影响自己手动输入 codex 时的行为。

最终效果是:

手动 SSH 后输入 codex:
  -> 仍然使用原来的真实 codex
  -> 仍然使用默认 ~/.codex

Codex Desktop Remote 启动:
  -> 它自己执行 PATH="$CODEX_INSTALL_DIR:$PATH"
  -> 命中 ~/.codex-desktop-bin/codex wrapper
  -> app-server 分支自动设置 CODEX_HOME / proxy

可以这样验证:

echo "$CODEX_INSTALL_DIR"
which codex 

理想情况下,输出应该类似:

/home/your-user/.codex-desktop-bin /path/to/real/codex 

再模拟一下 Codex Desktop 的启动方式:

/bin/sh -c 'PATH="${CODEX_INSTALL_DIR:-$HOME/.local/bin}:$PATH"; export PATH; command -v codex; codex --version' 

这时应该命中:

/home/your-user/.codex-desktop-bin/codex 

这就说明 Codex Desktop Remote 会走 wrapper 。


最终,在 Codex Desktop App 上可以愉快的接管远程 session ,愉快地 Vibe Coding 。不过,怎么让 Codex Desktop 里的会话也激活 conda 环境尚未研究出来,只能在 AGENTS.md 里明确了。

来源: v2ex查看原文