我在虚拟机上安装了全新的 FreeBSD 10 并通过 SSH 连接,我注意到每当我关闭程序(例如 htop、top、nano 等)时,会话的内容都会被覆盖。
例如,当我连接到 Ubuntu、Debian 服务器时,不会发生这种情况。
我也不太清楚这叫什么,所以谷歌搜索也帮不上什么忙。
有人曾经遇到过这种情况吗?/我需要更改 OpenSSH 服务器中的某些设置吗?
答案1
会议内容包括已经当您首先启动 TUI 程序时,它就会被覆盖。您可以看到确实如此。
当使用等来呈现其文本用户界面的 TUI 程序ncurses
启动时,它会清除屏幕。此时,屏幕上的所有内容都已被覆盖。
你忽略了,你不知道它的名字,是终端的概念,它有一个备用屏幕缓冲区。当此类 TUI 程序启动时,它会发出转义序列以切换到终端的备用屏幕缓冲区(如果有)。然后,它的所有输出都会进入该缓冲区。当程序退出或暂停自身时,它会发出转义序列以恢复主屏幕缓冲区,当 TUI 程序将其用户界面显示在备用缓冲区上时,主屏幕缓冲区保持不变。
对于没有备用屏幕缓冲区的终端,没有可发出的转义序列,全屏用户界面将覆盖终端上先前的内容。
terminfo
程序在或数据库中查找这些转义序列termcap
。在terminfo
世界中,终端功能被命名为smcup
和rmcup
。在termcap
世界中,它们被命名为ti
和te
。根据文档,它们没有提及屏幕缓冲区。
相反,他们谈论的是进入和退出“光标寻址模式”。这个概念是,一个呈现像这样的全屏界面的 TUI 程序是在光标寻址模式程序实际上不需要终端滚动;而仅输出滚动文本行的 TUI 程序则不需要。因此,人们可以切换到或退出此模式。(在现实世界中,事情并没有那么明确。例如:现代 shell(如 Z Shell)会移动光标进行行编辑、菜单完成等;$RPROMPT
但不切换到备用屏幕缓冲区,没有成熟的全屏用户界面,并且以滚动的方式操作。)
因此,这些功能通常不仅仅是切换缓冲区。 smcup
还包含用于保存当前光标位置的转义序列,以及rmcup
用于恢复它的转义序列(如果终端具有这样的转义序列)。
你的问题有两个:
- 您的 FreeBSD 系统上的数据库
termcap
没有您特定终端类型的te
条目ti
,因为该条目不完整。 - 首先,您没有为终端仿真器使用正确的终端类型。
终端类型取自您的TERM
环境变量,在服务器端。其值表示数据库中的条目termcap
。因此,请确保您的TERM
环境变量命名的条目具有/etc/termcap
与您的(本地)终端仿真器相匹配的功能。如果没有与您的终端仿真器匹配的包含ti
和的条目te
,那么您只需添加这样的条目即可。
答案2
正如 roens 所指出的,FreeBSD 在其默认的 termcap 条目 xterm-256color 中不包含 te/ti 定义。但是,它确实在 termcap 条目中包含了这些定义,供那些想要清除屏幕的人使用:xterm-clear。
因此,实现此目的的一个简单方法是设置TERM
变量:
export TERM=xterm-clear
尽管这是一个非常晚的答案,但我还是把它放在这里,因为我见过的许多其他解决方案(包括 roens 的)都比必要的复杂得多(涉及使用转义代码修改 termcap 文件并重新编译数据库,或使用文件.termcap
)。
答案3
我找到了需要改变的例子这篇文章在 FreeBSD 论坛上。进行此更改后,查看手册页或编辑文件时屏幕上的内容将被清除,只显示终端中的命令等(bash
)。现在还可以使用编辑器或其他类似过程中的各种滚动方法(如“两指滚动”)。
对我来说,运行的效果非常好,就是在中的术语别名中FreeBSD 11.0-RELEASE-p9
添加第 4 行(定义te
& )和前面的反斜杠:ti
/usr/share/misc/termcap
xterm-256color|xterm alias 3:\
:Co#256:pa#32767:\
:AB=\E[48;5;%dm:AF=\E[38;5;%dm:tc=xterm-new:\
:te=\E[2J\E[?47l\E8:ti=\E7\E[?47h::tc=xterm-xfree86:
因为我来自 macOS,并且我的TERM=xterm-256color
,所以我将上述内容添加到了xterm-256color|xterm alias
第 2884 行。您TERM
的文件中的和位置termcap
可能有所不同。
然后,在对 termcap 进行更改后,您必须使用以下命令重建 termcap 数据库:
cap_mkdb /usr/share/misc/termcap
(我本来想将此作为对现有答案的评论,但缺乏 >50 的声誉。)