¿Es posible cambiar el valor de $ TERM al llamar a ssh?

21

En mi terminal local, tengo TERM = konsole-256color, pero no todas las máquinas remotas que conecto tienen esta definición.

¿Es posible hacer que ssh cambie el TERM en la máquina remota? ¿Sin cambiar los scripts .bash * en la máquina remota, solo cambiando la configuración en mi escritorio local?


fuente

Respuestas:

9

He agregado el siguiente alias a mi archivo .bashrc. Utiliza la respuesta de OG pero la envuelve en un alias. Funciona de maravilla ;)

# Force xterm-color on ssh sessions
alias ssh='TERM=xterm-color ssh'
Johan
fuente
Esto funciona si uso ssh desde una terminal. Pero también tengo varios scripts que ejecutan ssh, y el alias no está expandido para ellos. ¿Hay alguna forma de evitar hacer un alias separado para cada uno de ellos?
Thayne
Si su script necesita un valor TERM específico, creo que sería mejor establecer esa variable en el script en sí. ¿O eso no es una opción?
Johan
Eso no es realmente una opción. Además, estos scripts seleccionan un servidor en función de algunos parámetros y abren una sesión ssh a ese servidor (o posiblemente servidores en una sesión tmux), los scripts en sí mismos no dependen del valor TERM.
Thayne
En ese caso, podría incluir su perfil bash o un script de alias por separado en el script con: shopt -s expand_aliases; source ~ / .bash_aliases
Johan
7
TERM=vt100 ssh some.host.name

En remoto, ejecute echo $ TERM .

OG
fuente
Pensé en ello, pero quiero configurarlo solo para un subconjunto de hosts a los que ssh, por lo que emitir TERM = ... ssh todo el tiempo no funcionará. y recordar qué hosts tienen información antigua de la tapa de término, y luego cambiar el comando sobre la marcha tampoco es bueno.
La configuración por host solo se admite en / etc / ssh / ssh_config, sin embargo, no conozco ningún valor de configuración para admitir la asignación de esquema de terminal por host.
OG
También se puede hacer en ~ / .ssh / config, que sé, pero tampoco puedo encontrar ninguna opción para modificar el entorno enviado al servidor remoto. Tenía la esperanza de que me perdí algo.
7

hombre ssh:

     ssh reads ~/.ssh/environment, and adds lines of the format
     “VARNAME=value” to the environment if the file exists and users are
     allowed to change their environment.  For more information, see the
     PermitUserEnvironment option in sshd_config(5).

Editar:

Ratas, esperaba que pudiera estar en el lado local, aún así, si hay voluntad, hay una manera. man ssh_conf:

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.

Dependiendo de la configuración de sshd en el extremo receptor, esto puede cumplir o no el requisito de "ninguna modificación remota de archivo".

Paweł Brodacki
fuente
1
Sí, pero esta es la configuración en el lado remoto, y necesito / quiero algo que cambie solo en el extremo local.
44
SendEnv no está relacionado. Posiblemente puede enviar variables env adicionales, pero: 1. no puede modificarlas, y 2. TERM se envía de todos modos, incluso si no aparece en SendEnv.
5

Aquí está mi solución rápida y sucia que acabo de juntar. Prefiero algo mejor. Supongo que podría usar un script de shell en su lugar. El ajuste de TERMvalores se deja como un ejercicio para el lector.

# To move into a separate plugin...
function ssh {
   if [[ "${TERM}" = screen* || konsole* ]]; then
     env TERM=screen ssh "$@"
   else
     ssh "$@"
   fi
}

Idealmente, haría algo como verificar los TERM en el otro lado, usando las ControlPersistcosas para evitar retrasos largos para conexiones múltiples.

docwhat
fuente
¡Gracias! Hice algo como esto, pero en lugar de buscar valores específicos de $TERMcon if/ elseconstruct, estoy usando $(echo -n "$TERM" | sed -e s/tmux/screen/)para reemplazar incondicionalmente el problemático "tmux" en mi término local con el tipo de "pantalla" más universalmente aceptado ( fuente aquí ).
Wincent