关闭应用程序时,OpenSSH,FreeBSD屏幕会被覆盖


3

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

终端截图

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

我也不知道这叫什么,所以Google帮不上忙。

有谁之前经历过这个吗?/我需要更改OpenSSH Server中的某些设置吗?

Answers:


4

最初启动TUI程序时,会话的内容被覆盖。您可以看到情况就是如此。

当使用ncurses诸如此类的工具来显示其文本用户界面的TUI程序启动时,它将清除屏幕。此时,屏幕上的所有内容均已被覆盖。

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

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

程序在terminfotermcap数据库中查找这些转义序列。在terminfo世界范围内,终端功能被命名为smcuprmcup。在termcap世界上,它们被命名为tite。如所记录,它们没有提及屏幕缓冲区。

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

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

您的问题是两件事之一:

  • termcapFreeBSD系统上的数据库没有特定终端类型的teti条目,因为条目不完整。
  • 首先,您没有为终端仿真器使用正确的终端类型。

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


听起来他的仿真器支持tite,并且他的TERM环境变量命名了一个/etc/termcap条目,该条目设置tite设置了适当的转义码。各种应用程序正在输出这些代码,他不喜欢由此产生的屏幕缓冲区切换。因此,建议应该选择一个省略 ti删除的条目te。如果需要自定义条目(或重写现有的),而不是编辑/etc/termcap,他可以把它~/.termcapTERMCAP环境变量。
Mike Brown

假设他用tcsh,这应该禁用tite不管他的终端类型是什么:setenv TERMCAP ${TERM}:ti@:te@:tc=${TERM}
迈克-布朗

您没有看问题中的图片,而是倒退了。
JdeBP 2015年

确实,屏幕截图至关重要,您是正确的。我很困惑,因为我习惯于在不带ti/ 的终端上进行操作te,因此当我切换到具有该功能的终端时,我说的是他所做的完全相同的事情:“我的会话被覆盖”,这意味着我的nano / less / vi /无论什么会话都消失了,并被我之前所做的一切所取代。从屏幕截图中我可以看到他正在谈论相反的情况。
Mike Brown

2

我发现例子的正是改变这种张贴在FreeBSD论坛。进行更改后,查看联机帮助页或编辑文件时屏幕上的内容将被清除,仅在我的终端(bash)中显示命令等。现在,在编辑器或其他类似过程中,还可以使用多种滚动方法(例如“两指滚动”)。

对我来说,出色的工作FreeBSD 11.0-RELEASE-p9是运行,将第四行(定义teti)和反斜杠添加到以下术语中的别名/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和my TERM=xterm-256color,因此已xterm-256color|xterm alias在2884行中将其添加到。您TERM和您termcap文件中的位置可能有所不同。

然后,在对termcap进行更改之后,必须使用以下方法重建termcap数据库:

cap_mkdb /usr/share/misc/termcap

(我将其作为对现有答案的评论,但缺乏> 50的声誉。)


2

正如roens所指出的那样,FreeBSD在其默认termcap条目xterm-256color中不包含te / ti定义。但是,对于需要屏幕清除的用户,它确实将这些定义包含在termcap条目中:xterm-clear。

因此,一种简单的方法是设置TERM变量:

export TERM=xterm-clear

即使答案很晚,我也想把它放在这里,因为我看到的许多其他解决方案(包括roens的解决方案)都比必要的复杂得多(涉及使用转义码修改termcap文件并重新编译db,或者使用.termcap文件)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.