Impedir que o cliente SSH passe a variável de ambiente TERM para o servidor?

20

Atualmente, estou usando o gnome-terminal do Fedora 18 e iniciei o multiplexador nele. Depois que eu me conectei a um servidor CentOS 5 via comando, eu encontrei:tmuxssh

  • ls resultado não tem cor
  • tmux, screen, hexedit, htopTudo falhou ao iniciar com mensagem de erro como:
    falha no terminal aberto: terminal ausente ou inadequado: screen-256color

Parece que sshpassa a variável de ambiente $ TERM para o servidor, mas não consigo encontrá-la no /etc/ssh/ssh_configarquivo do Fedora 18.

Embora eu possa alterar manualmente a variável $ TERM no servidor, sempre que eu conectar, isso acontece novamente. Então, como evitá-lo?

LiuYan 刘 研
fonte

Respostas:

17

$TERM é dizer aos aplicativos com que terminal eles estão falando para que eles saibam como falar com ele.

Altere-o para um valor suportado pelo host remoto e que corresponda o mais próximo possível do seu terminal ( screen).

A maioria dos sistemas Linux deve ter pelo menos uma screenentrada terminfo. Caso contrário, screenimplementa um superconjunto vt100e vt100é universal. Tão:

TERM=screen ssh host

ou

TERM=vt100 ssh host

Se você precisar do suporte para 256 cores, tente o xterm-256colorque deve estar próximo o suficiente ( screensuporta 256 cores da mesma maneira xterm) e informe aos aplicativos que seu aplicativo de terminal suporta 256 cores e diga como usá-los.

Ou você pode instalar a entrada terminfo no host remoto.

infocmp -x | ssh -t root@remote-host '
  cat > "$TERM.info" && tic -x "$TERM.info"'
Stéphane Chazelas
fonte
2
É bom saber infocmpe tic, uma vez compilado, não há necessidade de alterar temporariamente $TERMnovamente. a propósito, eu apenas copiei (rsync) /usr/share/terminfo/s/screen-256colordo Fedora 18 para o CentOS, parece que funciona bem ( rsync -tv /usr/share/terminfo/s/screen-256color root@the_host:/usr/share/terminfo/s).
LiuYan # 11/13
esqueci de mencionar, eu corri tmuxno gnome-terminal do Fedora 18, tmuxalterei o $TERMvalor para screen-256colorfrom xterm-256color.
LiuYan # 11/13
btw, o ssh pode funcionar desta maneira: obter o terminfo em que host / servidor é suportado (não enviado) e, em seguida, escolher um que o terminal do cliente possa suportar?
LiuYan # 11/13
2
infocmp | ssh -t root@remote-host 'cat > "$TERM.info" && tic "$TERM.info"'pode ser reduzido para infocmp | ssh root@remote-host "tic -". Isso funciona porque quando você tem um canal, ele pode ser acessado como um arquivo usando - e, felizmente, os canais funcionam no SSH.
Alan Jenkins
1
@ starfry, não posso garantir que o formato binário dos ticarquivos gerados (compilador terminfo) será o mesmo de um sistema para o outro ou que a localização deles será a mesma. tictambém pode garantir que as permissões estejam corretas ou criar diretórios intermediários quando necessário.
Stéphane Chazelas
10

No meu caso, simplesmente adicionei um alias ao meu .zshrc( .bashrcse estiver usando o bash) na área de trabalho local:

alias ssh='TERM=xterm ssh'

Se você já usa um alias, ajuste-o para incluir a atribuição Ambiente.

zaTricky
fonte
1

Coloquei isso no meu .bashrchost remoto:

# 256-color mode not supported on this host
if echo $TERM | grep -q -- '-256color'; then
    echo -e '\n\n256-color mode not supported on this host.  Reverting TERM...\n'
    export TERM=`echo -n $TERM | sed 's/-256color//'`
fi

Dessa forma, ambos xterm-256colore screen-265colorsão tratados adequadamente. Além disso, eu tenho que enviar a nota para que, se o servidor for atualizado posteriormente e oferecer suporte a 256 cores, não acabarei batendo com a cabeça na parede, perguntando-me por que minha variável TERM é alterada quando o SSHing.

depquid
fonte
Ou, não iniciar um subshell e outro processo:export TERM=${TERM%%-256color}
miken32
1

Mudar $TERMpode funcionar, mas não sugiro isso, é apenas uma solução alternativa em vez de uma solução.

Quando encontro esse problema nos meus sistemas, eu o corrigo instalando o suporte para os tipos de terminal mais comuns no sistema remoto:

  • yum install ncurses-basepara screen-256colorno CentOS
  • yum install ncurses-termpara screen-256color-bceno CentOS
  • apt install ncurses-basepara ambos screen-256colore screen-256color-bceno Debian, Ubuntu e Mint

Os pacotes relacionados ao ncurses também oferecem suporte a muitos outros terminais e também estão disponíveis em todas as outras grandes distribuições. (Mas, para o meu caso de uso e sua pergunta, essas informações devem ser suficientes)

Garo
fonte
0

Veja man ssh_config:

 SendEnv
         Specifies what variables from the local environ(7) should be sent
         to the server.  Note that environment passing is only supported
         for protocol 2.  The server must also support it, and the server
         must be configured to accept these environment variables.  Refer
         to AcceptEnv in sshd_config(5) for how to configure the server.
         Variables are specified by name, which may contain wildcard char‐
         acters.  Multiple environment variables may be separated by
         whitespace or spread across multiple SendEnv directives. The
         default is not to send any environment variables.

e man sshd_config:

 AcceptEnv
         Specifies what environment variables sent by the client will be
         copied into the session's environ(7).  See SendEnv in
         ssh_config(5) for how to configure the client.  Note that envi-
         ronment passing is only supported for protocol 2.  Variables are
         specified by name, which may contain the wildcard characters `*'
         and `?'.  Multiple environment variables may be separated by
         whitespace or spread across multiple AcceptEnv directives.  Be
         warned that some environment variables could be used to bypass
         restricted user environments.  For this reason, care should be
         taken in the use of this directive.  The default is not to accept
         any environment variables.

De acordo com isso, o padrão deve ser não enviar nenhuma variável, mas TERM parece ser especial. É enviar de qualquer maneira.

Portanto, você pode alterar o TERM ao chamar ssh (como TERM=xterm ssh ...), alterá-lo após o login (como em .bash_profile) ou definir o tipo de TERM desconhecido no lado do servidor (supondo que você tenha acesso root lá). Veja outra resposta para detalhes.

michas
fonte
1
Não definir $TERMrealmente não será melhor do que configurá-lo para um valor não suportado.
Stéphane Chazelas
A questão literal era: como impedir o envio do TERM. - Resposta: você não pode. - O que ele deve fazer é definir um valor adequado, sim.
Michas
alterar $TERMtemporariamente pode ser uma solução alternativa, mas preciso fazer isso sempre. a propósito, parece que ambos CentOS 5 e Fedora 18 Aceite Env todas as variáveis de ambiente local ( LANG, LC_*...)
Liuyan刘研