Quik
V2EX  ›  Codex

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

  •  
  •   Quik · 4 days ago · 494 views

    TL;DR:Codex 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 里明确了。

    Quik
        1
    Quik  
    OP
       4 days ago
    本来以为能开心手机上 Vibe Coding ,但并没有解决 iOS 上的 ChatGPT 连不上 Codex App 的问题☹️。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4301 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 61ms · UTC 10:05 · PVG 18:05 · LAX 03:05 · JFK 06:05
    ♥ Do have faith in what you're doing.