Codex SSH 连接远程 Ubuntu:从密码登录到密钥登录、安装远端 Codex、解决“未登录”的完整踩坑记录

前言

最近在给 Codex Desktop 添加一台远程 Ubuntu 服务器时,遇到了一串看似不相关、实际层层递进的问题:

  • OpenSSH 提示 Permission denied (publickey,password)
  • Codex 添加 SSH 连接时没有用户名和密码输入框
  • 连接后提示“此远程计算机上未安装 Codex”
  • 安装完成后又提示“你当前未登录”

这篇文章记录一次完整排障过程。重点不是“命令大全”,而是把每个错误背后的原因讲清楚,方便以后遇到同类问题快速定位。

说明:本文所有 IP、账号、密码、API Key 都建议替换成自己的真实信息。不要把真实密码、私钥、API Key 写进公开文章。

环境信息

本地环境:

Windows 11
OpenSSH_for_Windows_9.5p2
Codex Desktop

远端环境:

Ubuntu 24.04 LTS
root 用户
SSH 端口 22

示例连接信息:

显示名称:广州 | 广州三区
主机:<你的服务器 IP>
端口:22
用户名:root

问题一:OpenSSH 提示 Permission denied

一开始直接用 Windows OpenSSH 测试:

ssh root@<你的服务器 IP>

结果报错:

Permission denied (publickey,password).

但是同一台服务器,用 iShellPro 输入用户名和密码可以正常登录。

这个现象很容易误判为“密码错了”。但这里真正的问题是:Codex Desktop 的 SSH 连接不等同于 iShellPro 的密码登录配置。Codex 更依赖系统 OpenSSH 能否直接连通,而不是读取 iShellPro 里保存的密码。

关键结论:Codex SSH 连接更适合用密钥登录

在 Codex Desktop 的“添加 SSH 连接”界面里,如果没有看到用户名和密码输入框,不是操作错了,而是它当前更偏向使用系统 SSH 配置。

也就是说,建议先让下面这条命令能在本机直接成功:

ssh <ssh别名>

而不是依赖某个独立 SSH 客户端保存的密码。

第一步:在本机生成专用 SSH 密钥

在 Windows 上生成一把专门给 Codex 用的密钥:

ssh-keygen -t ed25519 -f "$env:USERPROFILE\.ssh\codex_gz3_ed25519" -N '""' -C "codex-gz3"

生成后会得到两个文件:

C:\Users\<你的用户名>\.ssh\codex_gz3_ed25519
C:\Users\<你的用户名>\.ssh\codex_gz3_ed25519.pub

其中 .pub 是公钥,可以放到服务器上;没有 .pub 后缀的是私钥,不能泄露。

查看公钥:

Get-Content "$env:USERPROFILE\.ssh\codex_gz3_ed25519.pub"

第二步:把公钥加入服务器 authorized_keys

用 iShellPro 先通过密码登录服务器,然后执行:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo '<这里替换成你的 ssh-ed25519 公钥>' >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

注意:只粘贴公钥,不要粘贴私钥。

第三步:配置 Windows OpenSSH 别名

编辑本机:

C:\Users\<你的用户名>\.ssh\config

添加:

Host gz-gz3
    HostName <你的服务器 IP>
    Port 22
    User root
    IdentityFile ~/.ssh/codex_gz3_ed25519
    IdentitiesOnly yes

然后验证:

ssh gz-gz3 "echo codex_alias_ok"

如果输出:

codex_alias_ok

说明本机到远端的 SSH 密钥登录已经打通。

此时在 Codex Desktop 添加 SSH 连接时,可以使用:

显示名称:广州 | 广州三区
主机:gz-gz3

问题二:提示“此远程计算机上未安装 Codex”

SSH 打通后,Codex Desktop 可能会继续提示:

此远程计算机上未安装 Codex

这说明 SSH 已经进入下一阶段了:远端服务器缺少 Codex CLI / app-server。

先登录远端检查:

command -v codex || true
command -v node || true
command -v npm || true

如果没有 Node/npm,先安装:

apt-get update
apt-get install -y nodejs npm

然后安装 Codex CLI:

npm install -g @openai/codex@latest
codex --version

第四步:为远端安装 Codex app-server 所需结构

Codex Desktop 远程连接需要远端有可启动的 app-server。执行:

codex app-server daemon bootstrap

如果提示:

managed standalone Codex install not found

通常说明远端缺少 standalone 路径。官方安装脚本可用时,可以执行:

curl -fsSL https://chatgpt.com/codex/install.sh | sh

如果服务器网络访问 chatgpt.com 不通,但 npm 包已经安装成功,可以把 npm 包自带的 Linux 原生 Codex 二进制链接到 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

再执行:

codex app-server daemon bootstrap
codex app-server daemon version

看到类似输出即可:

{
  "status": "running",
  "appServerVersion": "0.138.0"
}

问题三:提示“你当前未登录”

远端 Codex 安装完成后,Codex Desktop 又可能提示:

你当前未登录
登录 Codex

这说明远端 Codex 环境没有认证信息。

可以在远端执行:

codex doctor --summary

如果看到:

auth no Codex credentials were found

就需要给远端配置登录态。

如果你本机 Codex 已经使用 API Key 登录,可以把本机的 auth.json 同步到远端:

scp "$env:USERPROFILE\.codex\auth.json" gz-gz3:/root/.codex/auth.json

然后根据你的本机配置,给远端写一个最小化配置:

model = "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://你的模型服务地址"

保存到:

/root/.codex/config.toml

设置权限:

chmod 600 /root/.codex/auth.json /root/.codex/config.toml

重启远端 app-server:

codex app-server daemon restart

再次检查:

codex doctor --summary

最终看到:

18 ok · 0 warn · 0 fail ok

说明远端 Codex 已经配置完成。

问题四:远端已经登录,但 Codex Desktop 仍显示未登录

这个坑比较隐蔽。

如果你在同步认证文件之前已经点过 Codex Desktop 的 SSH 连接,远端可能已经启动了一个旧的桌面连接进程。它会继续保持旧状态,所以即使远端 doctor 已经全绿,桌面端还可能显示“未登录”。

可以在远端查看:

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,重新连接 SSH 主机。

最终验证清单

本机验证:

ssh gz-gz3 "echo ok"

远端验证:

codex --version
codex app-server daemon version
codex doctor --summary

理想结果:

SSH 正常
Codex CLI 正常
app-server running
doctor 0 fail

经验总结

这次排障最大的经验有四条:

  1. iShellPro 能密码登录,不代表 Codex Desktop 能直接复用它的密码。
  2. Codex SSH 连接优先把系统 OpenSSH 配置打通,推荐使用密钥登录。
  3. “未安装 Codex”说明 SSH 已经成功进入远端,只是远端缺少 Codex CLI/app-server。
  4. “你当前未登录”通常是远端 /root/.codex/auth.jsonconfig.toml 没配好,也可能是旧桌面连接进程缓存了旧状态。

遇到问题时,不要只看 Codex Desktop 的提示,最好同时在远端执行:

codex doctor --summary

这个命令能快速判断问题到底出在安装、认证、网络,还是 app-server。

结语

Codex SSH 远程连接的核心链路可以概括为:

本机 OpenSSH 密钥登录成功
-> 远端安装 Codex CLI
-> 远端 app-server bootstrap 成功
-> 远端 auth/config 配置成功
-> Codex Desktop 重新连接

只要按这条链路逐层验证,基本就能定位大多数 Codex SSH 远程连接问题。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐