关闭应用程序时 OpenSSH、FreeBSD 屏幕覆盖

Dan*_*iel 4 linux ssh terminal freebsd openssh

我在虚拟机上安装了新的 FreeBSD 10 并通过 SSH 连接,我注意到每当我关闭程序(例如 htop、top、nano 等)时,会话的内容都会被覆盖。

终端截图

例如,当我连接到 Ubuntu、Debian 服务器时,不会发生这种情况。

我也不太确定这叫什么,所以谷歌没有帮助。

有谁之前经历过这个吗?/ OpenSSH Server 中是否有一些设置需要更改?

Jde*_*eBP 7

当您首先启动 TUI 程序时,会话的内容已经被覆盖。你可以看到事实就是如此。

ncurses当使用诸如此类来呈现其文本用户界面的TUI 程序启动时,它会清除屏幕。那时,屏幕上的所有内容都已被覆盖。

您所缺少的,以及您不知道其名称的,是具有备用屏幕缓冲区的终端的想法。当这样的 TUI 程序启动时,它会发出转义序列以切换到终端的备用屏幕缓冲区(如果有)。然后它的所有输出都会进入该缓冲区。当程序退出或自行挂起时,它会发出转义序列来恢复主屏幕缓冲区,当 TUI 程序在备用缓冲区上显示其用户界面时,主屏幕缓冲区保持不变。

对于没有备用屏幕缓冲区的终端,没有可发出的转义序列,并且全屏用户界面会覆盖终端上以前的内容。

terminfo程序在或数据库中查找这些转义序列termcap。在terminfo世界上,终端功能被命名为smcuprmcup。在termcap世界上他们被命名为tite。根据记录,他们没有提到屏幕缓冲区。

相反,他们谈论进入和退出“光标寻址模式”。这个概念是,呈现全屏界面的 TUI 程序在光标寻址模式下运行,该程序实际上不需要终端滚动;而仅输出滚动文本行的 TUI 程序则不然。因此,人们可以切换进入和退出这种模式。(在现实世界中,事情并不是那么清晰。例如:现代 shell(如 Z Shell)移动光标以进行行编辑、菜单完成和$RPROMPT; 但不要切换到备用屏幕缓冲区,不要拥有成熟的全屏用户界面,并以滚动方式操作。)

因此,这些功能通常不仅仅是切换缓冲区。 smcup还包含用于保存当前光标位置的转义序列,以及rmcup用于恢复当前光标位置的转义序列(如果终端具有此类转义序列)。

您的问题是两件事之一:

  • FreeBSD 系统上的数据库termcap没有针对您的特定终端类型的teti条目,因为该条目不完整。
  • 首先,您没有为终端模拟器使用正确的终端类型。

终端类型取自服务器端TERM的环境变量。它的值表示数据库中的一个条目。因此,请确保您的环境变量命名的条目的功能与您的(本地)终端模拟器的功能相匹配。如果没有与包含和的终端仿真器相匹配的条目,那么您只需添加这样的条目即可。termcapTERM/etc/termcaptite