¿Evitar que el cliente SSH pase la variable de entorno TERM al servidor?


21

Actualmente estoy usando Fedora 18 gnome-terminal , luego comencé el tmuxmultiplexor en él. Después de conectarme a un servidor CentOS 5 mediante un sshcomando, encuentro:

  • ls el resultado no tiene color
  • tmux, screen, hexedit, htopTodo no se pudo iniciar con el mensaje de error como:
    terminal abierto fallido: terminal faltante o inadecuado: screen-256color

Parece que sshpasa la variable de entorno $ TERM al servidor, pero no puedo encontrarla en el /etc/ssh/ssh_configarchivo de Fedora 18.

Aunque puedo cambiar manualmente la variable $ TERM en el servidor, cada vez que me conecto, sucede nuevamente. Entonces, ¿cómo prevenirlo?

Respuestas:


18

$TERM es decirle a las aplicaciones con qué terminal están hablando para que sepan cómo hablar con él.

Cámbielo a un valor compatible con el host remoto y que coincida lo más posible con su terminal ( screen).

La mayoría de los sistemas Linux deberían tener al menos una screenentrada terminfo. Si no, screenimplementa un superconjunto de vt100y vt100es universal. Entonces:

TERM=screen ssh host

o

TERM=vt100 ssh host

Si necesita el soporte de 256 colores, puede probar xterm-256colorcuál debe estar lo suficientemente cerca ( screenadmite 256 colores de la misma manera xterm) y decirle a las aplicaciones que su aplicación de terminal admite 256 colores y decirles cómo usarlos.

O puede instalar la entrada terminfo en el host remoto.

infocmp -x | ssh -t root@remote-host '
  cat > "$TERM.info" && tic -x "$TERM.info"'

2
Es bueno saberlo infocmpy tic, una vez compilado, no es necesario cambiarlo temporalmente de $TERMnuevo. por cierto, acabo de copiar (rsync) /usr/share/terminfo/s/screen-256colorde Fedora 18 a CentOS, parece que funciona bien ( rsync -tv /usr/share/terminfo/s/screen-256color root@the_host:/usr/share/terminfo/s).
LiuYan 刘 研

olvidó de mencionado, i corrió tmuxen gnome-terminal de Fedora 18, tmuxcambiado $TERMvalor a screen-256colorpartir de xterm-256color.
LiuYan 刘 研

por cierto, ¿puede ssh funcionar de esta manera: obtener el terminal que host / servidor admitió (no empujó), luego recoger uno que el terminal del cliente puede admitir?
LiuYan 刘 研

2
infocmp | ssh -t root@remote-host 'cat > "$TERM.info" && tic "$TERM.info"'se puede acortar a infocmp | ssh root@remote-host "tic -". Esto funciona porque cuando tiene una tubería, se puede acceder como un archivo mediante el uso, y afortunadamente, las tuberías funcionan a través de SSH.
Alan Jenkins

1
@starfry, no puedo darle ninguna garantía de que el formato binario de los ticarchivos generados (compilador terminfo) será el mismo de un sistema a otro o que su ubicación será la misma. tictambién puede asegurarse de que los permisos sean correctos o crear directorios intermedios donde sea necesario.
Stéphane Chazelas

10

En mi caso, simplemente agregué un alias a mi .zshrc( .bashrcsi uso bash) en mi escritorio local:

alias ssh='TERM=xterm ssh'

Si ya usa un alias, ajústelo para incluir la asignación de entorno.


1

Puse esto en mi .bashrcen el host 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

De esa manera, ambos xterm-256colory screen-265colorse manejan adecuadamente. Además, tengo la salida de la nota para que si el servidor se actualiza más tarde y admite 256 colores, no terminaré golpeando mi cabeza contra la pared preguntándome por qué mi variable TERM se cambia cuando SSHing.


O no inicie un subshell y otro proceso:export TERM=${TERM%%-256color}
miken32

1

El cambio $TERMpodría funcionar, pero no sugiero esto, es solo una solución en lugar de una solución.

Cuando encuentro este problema en mis sistemas, lo soluciono instalando soporte para los tipos de terminales más comunes en el sistema remoto:

  • yum install ncurses-basepara screen-256coloren CentOS
  • yum install ncurses-termpara screen-256color-bceen CentOS
  • apt install ncurses-basepara ambos screen-256colory screen-256color-bceen Debian, Ubuntu y Mint

Los paquetes relacionados con ncurses también proporcionan soporte para muchos otros terminales, y también están disponibles en todas las demás distribuciones grandes. (Pero para mi caso de uso y su pregunta, esta debería ser suficiente información)


0

Ver 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.

y 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 acuerdo con eso, el valor predeterminado debería ser no enviar ninguna variable, pero TERM parece ser especial. Se envía de todos modos.

Por lo tanto, puede cambiar TERM al llamar a ssh (like TERM=xterm ssh ...), cambiarlo después de iniciar sesión (like in .bash_profile) o definir el tipo de TERM desconocido en el lado del servidor (suponiendo que tenga acceso root allí). Ver otra respuesta para más detalles.


1
Sin $TERMembargo, no establecer realmente no será mejor que establecerlo en un valor no compatible.
Stéphane Chazelas

La pregunta literal era, cómo evitar el envío de TERM. - Respuesta: no puedes. - Lo que debe hacer es establecerlo en un valor adecuado, sí.
michas

cambiar $TERMtemporalmente puede ser una solución, pero necesito hacerlo cada vez. por cierto, parece que ambos CentOS 5 y Fedora 18 Aceptar Env todas las variables de entorno local ( LANG, LC_*, ...)
Liuyan刘研
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.