3

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

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

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

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

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

3 ответа3

4

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

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

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

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

Программы ищут эти 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 , вам нужно просто добавить такую запись.

2

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

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

export TERM=xterm-clear

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

2

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .