Codex

Windows 远程 Ubuntu 跑 Codex:SSH 掉线与历史丢失解决

编辑部阅读约 5 分钟

在 Windows 11 上用 SSH 连 Ubuntu 运行 Codex,遇到空闲断连和对话顶部被吞,通常不是换一个客户端就能全部解决。关键是把问题拆成 SSH 传输、远程会话和终端回滚三层,分别用心跳、tmux/mosh、会话恢复与回滚设置处理。

在 Windows 11 上用 PowerShell 通过 SSH 连到 Ubuntu 运行 Codex,常见两类症状:闲置一段时间后出现 client_loop: send disconnect: Connection reset;对话变长后,终端顶部的内容被“吞掉”。前者通常是 SSH 传输层被中间网络设备或本机休眠切断,后者更多与终端回滚缓冲、Codex 的 TUI 重绘和会话管理有关,不宜混为一谈。

先厘清一个概念:PowerShell 是 shell,真正负责显示的是 Windows Terminal 一类终端模拟器,SSH 只是传输通道。换终端可能改善滚动、复制和渲染体验,但不能替代心跳配置和远程会话保持。

先判断问题发生在哪一层

现象 更可能的原因 优先处理
空闲后报 Connection reset TCP 连接被 NAT、防火墙、代理或休眠切断 SSH 心跳、tmux/mosh
断线后 Codex 进程消失 命令直接跑在裸 SSH 会话里 把任务放进 tmux
重连后顶部记录不见 终端回滚行数不够,或 Codex 自身重绘/裁剪 调大回滚、会话恢复
换客户端后闪退 客户端兼容性、渲染或 beta 版本问题 回退稳定终端,先做普通 SSH 测试

SSH 心跳:先配对,再验证

在用户目录的 .ssh/config 中给目标主机加心跳。特定主机配置放前面,通用兜底配置放后面,避免配置被前面的规则覆盖:

Host ubuntu-dev
    HostName 你的服务器地址
    User 你的用户名
    ServerAliveInterval 30
    ServerAliveCountMax 3
    TCPKeepAlive yes

Host *
    ServerAliveInterval 30
    ServerAliveCountMax 3

ServerAliveInterval 30 表示每 30 秒发一次保活探测,连续 3 次无响应才断开。改完后可用下面的命令确认配置是否命中:

ssh -G ubuntu-dev | Select-String -Pattern 'serveralive|tcpkeepalive'

如果服务器由你管理,也可以在 /etc/ssh/sshd_config 中加入服务端保活,然后重载服务:

ClientAliveInterval 60
ClientAliveCountMax 3
sudo systemctl reload ssh

需要注意:心跳只能减少“连接空闲被清理”的概率,不能解决笔记本休眠、Wi-Fi 切换、VPN 断线或中间设备直接重置连接。心跳加了仍然断,先检查配置是否真的生效,再看是否发生了换网或休眠。

长任务放进 tmux,别直接跑在裸 SSH 里

tmux 的价值不是“换个客户端”,而是让 Codex 进程留在服务器上。SSH 断了,tmux 会话还在;重新登录后 attach 回去即可。

sudo apt update && sudo apt install -y tmux
tmux new -s codex
codex
# 需要暂时离开时按 Ctrl+b,再按 d

重连后查看并恢复:

tmux ls
tmux attach -t codex

建议在 ~/.tmux.conf 中调大历史缓冲:

set -g history-limit 50000
set -g mouse on

重新加载配置后,新建会话会更稳妥地应用新限制。要强调一点:Codex 必须在 tmux 里启动,才能受到保护;已经在裸 SSH 中运行的进程,断线后通常无法事后搬进 tmux。

如果网络延迟高、经常切换网络,可以再考虑 mosh。它基于 UDP,对漫游和短时断网更宽容,但仍建议配合 tmux 使用:

sudo apt install mosh
mosh 用户名@服务器地址 -- tmux attach -t codex

Windows 端可通过 WSL 安装 mosh 客户端,或使用支持 mosh 的终端。服务器需要放行相应 UDP 端口,具体端口范围以 mosh 文档和服务器配置为准;在限制 UDP 的网络里,mosh 可能直接不可用。

历史被吞:终端回滚不等于 Codex 会话

顶部聊天记录消失,常见原因是终端只保留有限行回滚。可以在 Windows Terminal 设置中调大回滚行数,不同版本的字段名可能是 historySize 或 scrollbackLines,以本机设置界面为准。tmux 内则用 history-limit 控制可回看行数,按 Ctrl+b 再按 [ 进入复制模式翻看。

但要注意,PowerShell 的 $MaximumHistoryCount 只管命令历史,不管屏幕输出;调它不能找回聊天内容。另外,如果 Codex 自身在长对话中裁剪上下文或重绘界面,单纯加大终端缓冲也未必能恢复完整记录。

更稳妥的做法是使用 Codex 的会话恢复能力。先运行 codex --help,确认当前版本是否提供 resume 子命令或会话列表;如果支持,就用会话恢复而不是向上翻滚查找。重要对话还应及时导出或另存到笔记中,不要把终端回滚缓冲当成唯一存档。

客户端怎么选:稳定优先,再谈体验

方案 适合场景 取舍
Windows Terminal + OpenSSH 日常 SSH、稳定优先 内置轻量,回滚和复制要自己配置
WezTerm 需要更强定制、分屏和渲染 配置成本较高,需自行验证稳定性
VS Code Remote-SSH 既要跑 Codex,又要看文件、改代码 资源占用更大,远程工作区需正确配置
WindTerm 等第三方终端 需要会话管理、文件传输 不同版本稳定性差异大,建议先小规模试用
mosh + tmux 移动网络、高延迟、频繁断线 依赖 UDP,Windows 端准备成本较高
官方或第三方 GUI 远程模式 不想长期盯终端 功能与版本相关,底层仍受网络和会话保持影响

如果试用新终端出现闪退,先用同一台机器做普通 SSH 登录,运行 top、vim 等程序十分钟,排除是终端本身还是 Codex 兼容性问题;再更新客户端、关闭 GPU 加速或回退版本。面向 agent 的新终端复用器可以关注,但 Windows 端若仍是 beta,不建议直接把重要长任务放进去。

推荐组合与检查清单

稳定优先的组合是:Windows Terminal + OpenSSH 心跳 + tmux。网络较差时改为 mosh + tmux;需要同时编辑文件时用 VS Code Remote-SSH。排查时按下面顺序检查:

  1. 用 ssh -G 确认心跳配置命中目标主机。
  2. 确认 Codex 是在 tmux new -s codex 之后启动的。
  3. 断线重连后先 tmux ls,再 tmux attach -t codex。
  4. 调大 Windows Terminal 回滚行数和 tmux history-limit。
  5. 查看 codex --help,确认是否有可用的会话恢复命令。
  6. 记录断线时是否发生休眠、换 Wi-Fi、VPN 重连或代理超时。
  7. 不要在裸 SSH 里跑长时间 Codex 任务,也不要把终端回滚当成会话存档。

如果长期需要让 Codex 这类命令行工具保持在线,且本地电脑经常休眠或网络切换,也可以把运行环境放到整机托管的远程 Mac(例如新加坡机房按月租用的独享 Mac mini)上,通过远程连接使用;它改善的是运行环境稳定性,不替代心跳、tmux 和会话恢复这些基本手段。

远程开发终端tmuxCodex CLISSH