TL;DR:Codex Desktop App 的 Remote SSH 目前不会继承远端 shell 环境变量,但可以通过包一层 codex 启动脚本,把 http_proxy、CODEX_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 里明确了。