Ghostty SSH 连接 Ubuntu 时 Zsh 提示符异常与退格显示错乱排查

📅 2026/7/29 16:22:15 👁️ 阅读次数 📝 编程学习
Ghostty SSH 连接 Ubuntu 时 Zsh 提示符异常与退格显示错乱排查

问题重述

本地使用 Ghostty,通过 SSH 登录 Ubuntu 服务器后,出现以下异常:

(base) ?➜  ~

正常情况下应为:

(base) ➜  ~

此外还有以下问题:

  • 提示符前面多出一个 ?
  • 按 Backspace 实际已经删除字符
  • 但屏幕显示没有同步更新
  • 删除时会不断留下空格
  • 输入命令时经常出现字符错位

例如:

echo $TERM_PROGRAM

实际显示可能变成:

echo $TERM_PROGRAMM

原因排查

第一反应:Ghostty Terminfo 缺失

登录服务器后:

echo $TERM

输出:

xterm-ghostty

继续检查:

infocmp xterm-ghostty

发现能够正常输出 terminfo。

不是没有添加 terminfo 导致的问题:

unknown terminal type

注:此问题需要从客户机上导出 terminfo 并导入到服务器上。

第二步:怀疑 Locale

检查:

locale

结果:

LANG=en_US.UTF-8

UTF-8 配置正常。排除 Locale 导致 Unicode 字符显示异常,和 locale 没有关系。

第三步:怀疑 Oh My Zsh

启动纯净 zsh:

exec zsh -f

问题仍然存在,排除 Oh My Zsh 主题配置问题。

第四步:怀疑 Ghostty 与 ZLE 兼容性

检查:

bindkey | grep backward-delete-char

输出正常:

"^H" backward-delete-char
"^?" backward-delete-char

检查:

stty -a | grep erase

输出:

erase = ^?;

也正常,但光标错位依旧存在。

第五步:发现异常线索

查看当前使用的 terminfo:

which infocmp
which tic
which tput

输出:

/var/conda/bin/infocmp
/var/conda/bin/tic
/var/conda/bin/tput

此时发现:当前激活的是 Conda。

继续查看:

infocmp xterm-ghostty

显示来源:

/var/conda/share/terminfo/x/xterm-ghostty

也就是说:

Conda 环境有 Ghostty 的 terminfo,但是系统环境里面没有。

退出 Conda:

conda deactivate
hash -r

再次执行:

infocmp xterm-ghostty

直接报错:

couldn't open terminfo file

第六步:验证是否为系统 Terminfo 问题

启动一个完全干净的 Bash:

env -i HOME=$HOME TERM=xterm-ghostty /bin/bash --noprofile --norc

测试输入和退格。

结果:输入、退格、光标均正常

说明:

  • Ghostty 本身正常
  • SSH 正常
  • 键盘协议正常

问题是系统根本就没装上 xterm-ghostty terminfo,被 conda 的 env 劫持装到 conda 环境里面去了。

最终解决

从本机导出 Ghostty terminfo:

infocmp -x xterm-ghostty > ghostty.terminfo

复制到服务器后安装:

mkdir -p ~/.terminfo
tic -x -o ~/.terminfo ghostty.terminfo

验证:

infocmp xterm-ghostty

输出:

/home/xuyang/.terminfo/x/xterm-ghostty

说明已经安装到用户级 terminfo 数据库。

重新登录 SSH。

问题全部消失:

(base) ➜  ~

Backspace、光标移动、输入显示均恢复正常。

原因总结

问题并不是 Ghostty、SSH、Locale、Oh My Zsh 或 ZLE 本身。根因是 Conda 自带的 terminfo 数据库存在 xterm-ghostty,但是系统的里面没有。

部分组件能找到、部分组件找不到 terminfo,最终导致 ghostty 下光标定位和行编辑行为异常。

安装到用户的 terminfo 目录之后,所有组件使用同一份 terminfo,问题解决。

备忘

以后在任何 Linux 主机首次使用 Ghostty 时,可以直接执行:

mkdir -p ~/.terminfo
tic -x -o ~/.terminfo ghostty.terminfo

避免再次踩坑。