在日常开发中,用 SSH 连接到远程服务器跑 CLI 工具已经是家常便饭。不过,最近有不少朋友(包括我自己)在用 OpenSSH(配合 Windows Terminal)连接 Debian 服务器使用 codex-cli 时,遇到了一个让人抓狂的 Bug:AI 的回答稍微长一点,屏幕下面就显示不全了。更离谱的是,此时向上滚动根本看不到之前的内容,仿佛被无情截断,但如果你输入 /exit 退出会话然后 resume 恢复,刚才被“吞掉”的内容又整整齐齐地显示出来了。

这到底是 AI 抽风,还是终端设了什么“隐形墙”?今天咱们就来扒一扒背后的原理,顺便分享几个立竿见影的解决方案。

问题初诊:是 Buffer 短了还是 Terminal 懒了?

首先,我们要明白一个概念:终端回滚缓冲区(Scrollback Buffer)

当你 SSH 到服务器时,你的本地终端(比如 Windows Terminal)就像一个显示窗口,而服务器传来的字符流则是内容。如果“回滚缓冲区”设置得太小,或者程序没有正确使用“全屏应用”的规范,输出的内容超出了当前屏幕高度,而且没有被记录进缓冲区,那你一滚轮滑上去,自然就是一片空白或只有残片。

codex-cli 这类工具在输出流式文本时,如果终端的缓冲区满了,本地终端可能会直接丢弃最早的数据,导致你无法回溯。

深度分析:伪终端与控制序列的博弈

除了缓冲区大小,还有一个更隐蔽的原因:伪终端(PTY)模式

Windows Terminal 设置界面,展示如何调整 Scrollback 缓冲区行数

调整 Windows Terminal 的 Scrollback 设置

当你在 SSH 会话中运行某些交互式程序时,它们可能会尝试控制终端的显示模式。有时候,程序可能会意外地让终端进入一种“行模式”或受限模式,导致滚动失效。你提到的“双击 ESC 进入 raw 模式”也滚不到下面,这其实是一个关键线索。

如果程序在输出过程中改变了终端的属性,或者 SSH 协议在传输大量数据时触发了某种流控,可能会导致本地终端的“分页”机制失灵。这时候,虽然服务端已经输出了所有内容,但你的本地窗口可能“以为”显示结束了,从而停止了更新或废弃了之前的行。

现场急救:那个奇怪但好用的“杀虫剂”

![tmux 终端复用器使用 Ctrl+B 进入复制模式查看历史记录的演示

使用 tmux 的复制模式查看被截断的历史内容

帖子中提到的 /exitresume 的操作之所以能生效,原理在于:

  1. 重置状态/exit 清理了当前的会话状态,可能也向 Shell 发送了重置终端控制序列的信号。
  2. 重新绘制:当你 resume 时,codex-cli 可能会尝试重新渲染之前的上下文,或者此时终端已经从那个奇怪的“卡死状态”中恢复,缓冲区重新变得可用。

如果你经常遇到这个问题,这个操作虽然看起来麻烦,但目前是一个非常有效的临时解决方案。毕竟,为了看完一段完整的代码,多敲两下命令总比重新生成要快。

终极优化:从根源上解决问题

虽然“退出再进”能解燃眉之急,但作为追求丝滑体验的开发者,我们当然想一劳永逸。以下是一些排查和优化方向:

1. 检查本地终端配置

  • Windows Terminal:进入设置,找到你的 Debian SSH 配置文件,调整 Scrollback(历史记录行数)。把它从默认的几千行调大到 99999 或者直接设置为无限。虽然这不能解决“无法滚动”的逻辑死锁,但至少能保证物理内存足够存下输出。

2. 强制使用分页器

如果工具本身支持,尝试在输出后强制调用分页器(如 lessmore)。虽然 codex-cli 可能没有原生支持,但你可以检查它的配置文件,看看是否有关于输出流控制的选项。有些 CLI 工具支持 PAGER 环境变量,尝试设置 export PAGER=less 看看能否改善。

3. 检查 OpenSSH 客户端设置

偶尔,OpenSSH 的伪终端分配(-T 参数的使用)也会影响程序的渲染。如果条件允许,尝试在 SSH 命令中去掉 -t 参数,或者显式加上 -t 强制分配伪终端,观察表现是否有变化。

4. 使用 tmux 或 screen

这可能是最稳妥的建议。既然本地终端靠不住,那就把会话托管在服务端。

在 SSH 登录后直接运行 tmuxscreen new。这些工具拥有强大的回滚缓冲区管理能力,完全独立于你本地的终端模拟器。即使 Windows Terminal 也就是个“ dumb terminal”,tmux 里依然保留着完整的输出历史。你只需要用 Ctrl+B 然后按 [ 进入复制模式,就能随意上下滚动查看所有被截断的内容了。

写在最后

codex-cli 的截断问题,本质上是古老的标准终端技术与现代化的流式 AI 输出之间的一次小小的“水土不服”。在工具方没有彻底修复这个渲染逻辑之前,善用 tmux 这种工具,或者掌握“退出恢复法”,能让你在远程开发中少掉几根头发。

如果你有更好的解决方案,欢迎在评论区分享你的“独门秘籍”!

标签: none

评论已关闭