
1. 为什么 Codex SSH 连远程 Ubuntu 总卡在“未登录”Codex 通过 SSH 连接远程 Ubuntu 跑任务本质是把本机的 Codex Desktop 当作控制端把远端 Ubuntu 当作执行端。控制端负责界面和会话管理执行端负责真正跑模型请求、读写文件、执行命令。链路里任何一环没打通桌面端都会给出一个笼统的提示最常见的就是“此远程计算机上未安装 Codex”和“你当前未登录”。这两个提示看着像安装问题、账号问题实际上背后可能是 SSH 密钥没配好、远端 CLI 没装、app-server 没 bootstrap、auth.json 没同步或者旧连接进程缓存了状态。我试过在一台 Ubuntu 24.04 上从零配一遍踩的坑基本都集中在这几处。这篇按“本机密钥登录 → 远端装 Codex → app-server 启动 → 认证配置 → 桌面端重连”的顺序写每一步都给可复制的命令和预期输出。你跟着做遇到报错也能对照第五节逐条排查。适合谁手上有远程 Ubuntu 服务器、想用 Codex Desktop 通过 SSH 跑远端任务、但被“未登录”卡住的开发者。核心检索词就三个Codex、SSH、Ubuntu外加密钥登录和 app-server 这两个高频报错点。先说清楚一个前提Codex Desktop 的 SSH 连接不等同于 iShellPro、Xshell 这类客户端的密码登录。它更依赖系统 OpenSSH 能否直接连通而不是读取某个独立客户端里保存的密码。所以如果你在“添加 SSH 连接”界面没看到用户名和密码输入框不是操作错了而是它当前更偏向使用系统 SSH 配置。把系统 OpenSSH 打通后面的事才顺。2. 前置准备TaoToken 与远端环境确认在动手配 SSH 之前先把远端环境和模型服务入口确认好。远端 Ubuntu 需要能访问外网、能装 Node/npm并且有一个可用的模型服务地址。这里我用 TaoToken 作为模型服务入口它的 API 地址是 https://taotoken.net/api控制台和密钥管理在 https://taotoken.net/api-keys。如果你还没建 Key先去控制台建一个后面写 config.toml 会用到。远端环境建议先跑一遍基础检查确认系统版本和已有工具lsb_release -a command -v node || true command -v npm || true command -v codex || true如果 node 和 npm 都没有先装apt-get update apt-get install -y nodejs npm node -v npm -vNode 版本建议 18 以上npm 建议 9 以上。版本太低会导致 Codex CLI 安装后启动异常。装完再确认一次command -v codex如果为空说明还没装 Codex CLI这是正常的下一步会装。关于模型服务入口TaoToken 提供的是兼容 OpenAI 风格的接口base_url 填https://taotoken.net/apiwire_api 用responses。这个信息在写远端 config.toml 时会直接用到。如果你用的是别的服务地址替换成自己的即可但格式保持一致。注意远端服务器的时间要准。时间偏差过大会导致 TLS 握手失败表现为请求超时或认证失败。用date看一下偏差大就apt-get install -y ntpdate ntpdate pool.ntp.org校准。3. 可复制配置SSH 密钥登录 远端 Codex 安装3.1 本机生成专用 SSH 密钥在 Windows 本机生成一把专门给 Codex 用的 ed25519 密钥不要复用日常登录的密钥方便后续管理和吊销ssh-keygen -t ed25519 -f $env:USERPROFILE\.ssh\codex_gz3_ed25519 -N -C codex-gz3生成后得到两个文件codex_gz3_ed25519私钥不能泄露和codex_gz3_ed25519.pub公钥放到服务器。查看公钥内容Get-Content $env:USERPROFILE\.ssh\codex_gz3_ed25519.pub复制输出的整行下一步要用。3.2 把公钥写入远端 authorized_keys先用密码登录远端iShellPro 或系统 ssh 都行然后执行mkdir -p ~/.ssh chmod 700 ~/.ssh echo 这里替换成你的 ssh-ed25519 公钥 ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys只粘贴公钥不要粘贴私钥。权限必须是 700 和 600权限不对 OpenSSH 会直接拒绝使用这个密钥。3.3 配置本机 SSH 别名编辑本机C:\Users\你的用户名\.ssh\config加入Host gz-gz3 HostName 你的服务器 IP Port 22 User root IdentityFile ~/.ssh/codex_gz3_ed25519 IdentitiesOnly yes ServerAliveInterval 30 ServerAliveCountMax 3IdentitiesOnly yes很关键它强制只用指定的私钥避免本机其他密钥干扰导致Permission denied (publickey,password)。ServerAliveInterval防止长连接被中间设备断开。验证别名是否打通ssh gz-gz3 echo codex_alias_ok输出codex_alias_ok就说明密钥登录成功。如果还是Permission denied回到第五节排查。3.4 远端安装 Codex CLISSH 打通后在远端装 Codex CLInpm install -g openai/codexlatest codex --versioncodex --version能输出版本号就说明 CLI 装好了。如果 npm 全局安装后command -v codex仍为空检查 npm 全局 bin 目录是否在 PATH 里npm config get prefix echo $PATH把 prefix 下的 bin 目录加进 PATH或者用npm install -g时加--prefix /usr/local。3.5 远端 app-server bootstrapCodex Desktop 远程连接需要远端有可启动的 app-server。执行codex app-server daemon bootstrap如果提示managed standalone Codex install not found说明远端缺少 standalone 路径。先尝试官方安装脚本curl -fsSL https://chatgpt.com/codex/install.sh | sh如果服务器访问该地址不通但 npm 包已经装好可以把 npm 包自带的 Linux 原生二进制链接到 standalone 预期位置mkdir -p /root/.codex/packages/standalone/current ln -sf /usr/local/lib/node_modules/openai/codex/node_modules/openai/codex-linux-x64/vendor/x86_64-unknown-linux-musl/bin/codex /root/.codex/packages/standalone/current/codex再执行 bootstrap 和版本检查codex app-server daemon bootstrap codex app-server daemon version看到类似{status: running, appServerVersion: 0.138.0}就说明 app-server 起来了。3.6 远端 config.toml 与 auth.json远端 Codex 需要认证信息。先检查codex doctor --summary如果看到auth no Codex credentials were found就需要配置登录态。把本机已登录的 auth.json 同步到远端scp $env:USERPROFILE\.codex\auth.json gz-gz3:/root/.codex/auth.json然后写远端/root/.codex/config.tomlmodel codex-auto-review model_provider custom model_reasoning_effort high [model_providers.custom] name custom wire_api responses requires_openai_auth true base_url https://taotoken.net/api设置权限并重启 app-serverchmod 600 /root/.codex/auth.json /root/.codex/config.toml codex app-server daemon restart codex doctor --summary最终看到18 ok · 0 warn · 0 fail ok就说明远端配置完成。4. 验证请求逐条命令确认链路配置完成后按下面顺序逐条验证每一条都有明确的预期输出哪一条不对就停在哪一步排查。本机到远端 SSHssh gz-gz3 echo ok预期输出ok。如果失败问题在本机 SSH 配置或远端 authorized_keys。远端 Codex CLIssh gz-gz3 codex --version预期输出版本号。如果报 command not found问题在 npm 全局安装或 PATH。远端 app-serverssh gz-gz3 codex app-server daemon version预期输出status: running和版本号。如果 status 不是 running执行codex app-server daemon restart再看。远端认证状态ssh gz-gz3 codex doctor --summary预期0 fail。如果有 auth 相关 fail检查 auth.json 和 config.toml 是否都在/root/.codex/下且权限为 600。模型请求连通性ssh gz-gz3 codex exec print hello预期返回模型输出。如果超时检查远端到https://taotoken.net/api的网络连通性ssh gz-gz3 curl -sS -o /dev/null -w %{http_code} https://taotoken.net/api返回 200 或 401 都说明网络通401 是没带 Key 的正常响应。最后回到 Codex Desktop重新添加或重连 SSH 主机显示名称可以写“广州 | 广州三区”主机填gz-gz3。连接后如果仍提示未登录先看第五节。5. 本篇常见错排查5.1 Permission denied (publickey,password)这个报错最容易误判成密码错。实际原因通常是本机没用对私钥或者远端 authorized_keys 权限不对。排查顺序先确认ssh -v gz-gz3输出里有没有Offering public key如果没有说明 config 里 IdentityFile 路径不对如果有但被拒登录远端检查ls -la ~/.ssh/authorized_keys 必须是 600.ssh 必须是 700。另外确认公钥是完整一行没有换行截断。5.2 此远程计算机上未安装 Codex这个提示说明 SSH 已经通了只是远端缺 Codex CLI 或 app-server。在远端跑command -v codex和codex app-server daemon version哪个为空就补哪个。注意 Codex Desktop 检测的是 app-server 的 standalone 路径不是 npm 全局的 codex 命令所以即使codex --version正常也可能报“未安装”这时按 3.5 做软链接。5.3 你当前未登录远端 Codex 环境没有认证信息。先codex doctor --summary看 auth 行。如果是no Codex credentials were found同步 auth.json 并写 config.toml。注意 config.toml 里requires_openai_auth true和wire_api responses要和服务端匹配base_url 不要多写或少写/api。5.4 远端 doctor 全绿但桌面端仍显示未登录这个坑比较隐蔽。如果你在同步认证文件之前已经点过 Codex Desktop 的 SSH 连接远端可能已经启动了一个旧的桌面连接进程它会继续保持旧状态。在远端查看ps -ef | grep codex | grep -v grep如果看到desktop-ssh-websocket-v0.sock相关进程清理掉pkill -f desktop-ssh-websocket-v0.sock || true rm -f /root/.codex/app-server-control/desktop-ssh-websocket-v0.sock然后回 Codex Desktop 重新连接。5.5 app-server bootstrap 报 standalone not found按 3.5 先试官方脚本不通就做软链接。软链接路径里的x86_64-unknown-linux-musl要和你服务器架构一致ARM 机器换成aarch64-unknown-linux-musl。链接完确认ls -la /root/.codex/packages/standalone/current/codex指向真实文件。5.6 模型请求超时或 401超时先查网络curl -sS -o /dev/null -w %{http_code} https://taotoken.net/api。401 说明网络通但 Key 没带上或无效检查 auth.json 是否同步、config.toml 的 base_url 是否正确。如果 Key 是在 TaoToken 控制台新建的确认 Key 状态是启用。需要重新生成或管理 Key去 https://taotoken.net/api-keys。6. 跑通之后把远端 Codex 用起来链路跑通后日常使用其实很简单本机ssh gz-gz3能通远端codex doctor --summary全绿Codex Desktop 里重连一次就能用。如果后面要长期在远端跑编码任务或 Agent 类工作流建议把 app-server 配成开机自启避免每次重启服务器都要手动 bootstrap。另外远端 config.toml 里的model_reasoning_effort可以按任务调日常用medium复杂重构用high。如果你还没建模型服务的 Key或者想换一个更稳定的入口可以去 https://taotoken.net/api-keys 建一个然后在远端 config.toml 里把 base_url 指向https://taotoken.net/api。接入文档在 https://taotoken.net/doc里面有 wire_api 和认证方式的说明配之前扫一眼能少踩几个格式坑。想先验证模型对话是否正常可以用 https://taotoken.net/models 上的对话入口发一条测试消息确认 Key 和服务地址都对再回到远端配 Codex。最后留一个实用习惯每次改完远端 config.toml 或 auth.json都跑一遍codex doctor --summary看到0 fail再回桌面端重连。这个命令能快速判断问题到底出在安装、认证、网络还是 app-server比盯着桌面端的笼统提示猜要快得多。