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

4 天前
 Quik

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

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

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

比如:

手动 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" 的意思是:

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

解决思路

无须污染日常 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 里明确了。

494 次点击
所在节点    Codex
1 条回复
Quik
4 天前
本来以为能开心手机上 Vibe Coding ,但并没有解决 iOS 上的 ChatGPT 连不上 Codex App 的问题☹️。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1213175

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX