OpenSSH, перезапись экрана FreeBSD при закрытии приложения

Я установил свежую FreeBSD 10 на ВМ и подключился через SSH, и заметил, что всякий раз, когда я закрываю программу (например, htop, top, nano и т. Д.), Содержимое сессии перезаписывается.

Скриншот терминала

Этого не происходит, когда я подключаюсь к Ubuntu, например к серверу Debian.

Я не совсем уверен, как это называется, так что Google не поможет.

Кто-нибудь испытывал это раньше? / Есть ли какие-то настройки в OpenSSH Server, которые мне нужно изменить?

3 ответа

Решение

Содержание сессии уже было перезаписано, когда вы в первую очередь запустили программы TUI. Вы можете видеть, что это так.

Когда программа TUI, которая использует ncurses и тому подобное, чтобы представить свой текстовый пользовательский интерфейс, запускается, он очищает экран. В этот момент все, что на экране, было перезаписано.

То, что вам не хватает, и то, для чего вы не знаете названия, это идея терминалов, которые имеют альтернативный экранный буфер. Когда запускается такая программа TUI, как эта, она выдает управляющую последовательность, чтобы переключиться на альтернативный экранный буфер терминала, если таковой имеется. Весь его вывод затем отправляется в этот буфер. Когда программа завершает работу или приостанавливает свою работу, она запускает управляющую последовательность, чтобы восстановить основной экранный буфер, который остался нетронутым, пока программа TUI отображала свой интерфейс пользователя в альтернативном буфере.

Для терминалов, у которых нет альтернативных экранных буферов, не нужно выдавать управляющую последовательность, а полноэкранный пользовательский интерфейс перезаписывает то, что было ранее на терминале.

Программы ищут эти escape-последовательности в terminfo или же termcap базы данных. в terminfo Мир терминальные возможности названы smcup а также rmcup, в termcap Мир, который они назвали ti а также te, Как документально подтверждено, они не упоминают о буферах экрана.

Вместо этого они говорят о входе и выходе из "режима адресации курсора". Идея состоит в том, что программа TUI, которая представляет такой полноэкранный интерфейс, работает в режиме адресации курсора, когда программе действительно не нужен терминал для прокрутки; в то время как программа TUI, которая просто выводит строки прокрутки текста, не является. Таким образом, каждый переключается в и из этого режима. (В реальном мире все не так ясно. Например: современные оболочки, такие как Z Shell, перемещают курсор для редактирования строк, завершения меню и $RPROMPT; но не переключайтесь на альтернативный экранный буфер, не располагайте полноценным полноэкранным пользовательским интерфейсом и не используйте прокрутку.)

Таким образом, возможности обычно делают больше, чем просто переключение буферов. smcup также содержит escape-последовательность для сохранения текущей позиции курсора, и rmcup escape-последовательность для ее восстановления, если терминал имеет такие escape-последовательности.

Ваша проблема - одна из двух вещей:

  • termcap база данных в вашей системе FreeBSD не имеет te а также ti записи для вашего конкретного типа терминала, потому что запись является неполной.
  • Во-первых, вы не используете правильный тип терминала для эмулятора терминала.

Тип терминала взят из вашего TERM переменная окружения на стороне сервера. Его значение обозначает запись в termcap база данных. Поэтому убедитесь, что ваш TERM переменная окружения называет запись в /etc/termcap с возможностями, которые совпадают с возможностями вашего (локального) терминала эмулятора. Если нет записи, соответствующей вашему эмулятору терминала, которая содержит ti а также te, тогда вам нужно будет просто добавить такую ​​запись.

Как указывает roens, FreeBSD не включает определения te/ti в свою запись termcap по умолчанию, xterm-256color. Однако он включает эти определения в запись termcap для тех, кто хочет очистить экран: xterm-clear.

Таким образом, простой способ сделать это состоит в том, чтобы установить TERM переменная:

export TERM=xterm-clear

Несмотря на то, что это очень поздний ответ, я помещаю его здесь, потому что многие другие решения, которые я видел (в том числе Роэнса), намного сложнее, чем необходимо (включая изменение файла termcap с помощью escape-кодов и перекомпиляцию db, или используя .termcap файл).

Я нашел пример того, что можно изменить в этой публикации на форуме FreeBSD. После внесения этого изменения все, что отображается на экране при просмотре man-страницы или редактировании файла, удаляется, показывая только команды и тому подобное в моем терминале (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 репутации.)

Другие вопросы по тегам