OpenSSH, tela FreeBSD sobrescreve ao fechar a aplicação

3

Instalei um novo FreeBSD 10 em uma VM e conectei via SSH e notei que sempre que eu fecho um programa (por exemplo, htop, top, nano etc) o conteúdo da sessão é sobrescrito.

Isso não acontece quando eu conecto a um servidor Debian Ubuntu, por exemplo.

Também não sei bem como isso é chamado, por isso o Google não ajuda.

Alguém já experimentou isso antes? / Existe alguma configuração no OpenSSH Server que eu preciso mudar?

    
por Daniel 11.02.2014 / 02:16

3 respostas

4

O conteúdo da sessão já foi substituído, quando você iniciou os programas da TUI em primeiro lugar. Você pode ver que esse é o caso.

Quando um programa TUI, que usa ncurses e semelhantes para apresentar sua interface de usuário textual, é iniciado, ele limpa a tela. Nesse momento, tudo o que está na tela foi sobrescrito.

O que você está perdendo, e o que você não sabe o nome, é a idéia de terminais que têm um buffer de tela alternativo . Quando um programa TUI como esse é iniciado, ele emite a sequência de escape para alternar para o buffer de tela alternativo do terminal, se houver um. Toda a sua saída vai para esse buffer. Quando o programa sai ou se suspende, ele emite a seqüência de escape para restaurar o buffer de tela principal, que permaneceu inalterado enquanto o programa TUI exibia sua interface de usuário no buffer alternativo.

Para terminais que não têm buffers de tela alternativos, não há sequência de escape a ser emitida e a interface de usuário em tela cheia sobrescreve o que estava anteriormente no terminal.

Os programas procuram essas sequências de escape nos bancos de dados terminfo ou termcap . No terminfo world, os recursos do terminal são denominados smcup e rmcup . No mundo termcap , eles são denominados ti e te . Conforme documentado, eles não mencionam os buffers de tela.

Em vez disso, eles falam de entrar e sair do "modo de endereçamento do cursor". A ideia é que um programa TUI que apresente uma interface de tela cheia como essa esteja operando no modo de endereçamento do cursor onde o programa realmente não precisa do terminal para rolar; Considerando que um programa TUI que apenas exibe linhas de texto de rolagem não é. Então, um entra e sai desse modo. (No mundo real, as coisas não são tão claras. Por exemplo: os shells modernos como o Z Shell movem o cursor para edição de linha, conclusão de menu e $RPROMPT ; mas não alternam para o buffer alternativo de tela, não tem uma interface de usuário de tela inteira completa e opera em termos de rolagem.)

Portanto, os recursos geralmente fazem mais do que apenas alternar buffers. smcup também contém a seqüência de escape para salvar a posição atual do cursor, e rmcup a seqüência de escape para restaurá-la, assim como, se o terminal tiver essas seqüências de escape.

Seu problema é uma das duas coisas:

  • O banco de dados termcap em seu sistema FreeBSD não possui te e ti entradas para seu tipo de terminal específico, porque a entrada está incompleta.
  • Você não está usando o tipo de terminal correto para seu emulador de terminal, em primeiro lugar.

O tipo de terminal é retirado da sua variável de ambiente TERM , no servidor final . Seu valor denota uma entrada no banco de dados termcap . Portanto, certifique-se de que sua variável de ambiente TERM nomeie uma entrada em /etc/termcap com os recursos correspondentes aos do emulador de terminal (local). Se não houver uma entrada correspondente ao emulador de terminal que contenha ti e te , você deverá simplesmente adicionar essa entrada.

    
por 11.02.2014 / 22:27
2

Eu encontrei um exemplo do que mudar em esta postagem no fórum do FreeBSD. Depois de fazer essa alteração, o que está na tela durante a exibição de uma página de manual ou a edição de um arquivo é removido, mostrando apenas os comandos & tal no meu terminal ( bash ). O que também funciona agora é a variedade de métodos de rolagem (como "rolagem com dois dedos"), enquanto em um editor ou outro processo desse tipo.

O que funcionou de forma esplêndida para mim, executando FreeBSD 11.0-RELEASE-p9 , é adicionar a quarta linha (definindo te & ti ) e precedendo a contrabarra ao termo alias em /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:

Como estou vindo do macOS e meu TERM=xterm-256color , adicionei o acima a xterm-256color|xterm alias , na linha 2884. Seu TERM e o posicionamento em seu arquivo termcap podem ser diferentes.

Depois de fazer alterações no termcap, você terá que reconstruir o banco de dados termcap com:

cap_mkdb /usr/share/misc/termcap

(Eu teria oferecido isso como um comentário para a resposta existente, mas com falta de reputação).

    
por 09.09.2017 / 02:20
2

Como apontado por roens, o FreeBSD não inclui as definições te / ti em sua entrada padrão termcap, xterm-256color. No entanto, ele inclui essas definições em uma entrada termcap para aqueles que desejam limpar a tela: xterm-clear.

Assim, uma maneira fácil de conseguir isso é definir sua variável TERM :

export TERM=xterm-clear

Apesar de ser uma resposta muito tardia, estou colocando isso aqui porque muitas das outras soluções que vi (incluindo as do roens) são muito mais complicadas do que o necessário (envolvendo modificar o arquivo termcap com os códigos de escape e recompilar o db, ou usando um arquivo .termcap ).

    
por 13.04.2018 / 05:51