Est-il possible de changer la valeur de $ TERM lors de l'appel de ssh?

21

Sur mon terminal local, j'ai TERM = konsole-256color, mais pas toutes les machines distantes que je connecte pour avoir cette définition.

Est-il possible de faire ssh changer le TERM sur la machine distante? Sans changer les scripts .bash * sur la machine distante, juste en changeant la configuration sur mon bureau local?


la source

Réponses:

9

J'ai ajouté l'alias suivant à mon fichier .bashrc. Il utilise la réponse d'OG mais l'enveloppe dans un alias. Fonctionne comme un charme;)

# Force xterm-color on ssh sessions
alias ssh='TERM=xterm-color ssh'
Johan
la source
Cela fonctionne si j'utilise ssh à partir d'un terminal. Mais j'ai également plusieurs scripts qui exécutent ssh, et l'alias n'est pas développé pour eux. Existe-t-il un moyen d'éviter de créer un alias séparé pour chacun d'eux?
Thayne
Si votre script a besoin d'une valeur TERM spécifique, je pense qu'il serait préférable de simplement définir cette variable dans le script lui-même. Ou n'est-ce pas une option?
Johan
Ce n'est pas vraiment une option. De plus, ces scripts sélectionnent un serveur en fonction de certains paramètres et ouvrent une session ssh à ce serveur (ou éventuellement des serveurs dans une session tmux), les scripts eux-mêmes ne dépendent pas de la valeur TERM.
Thayne
Dans ce cas, vous pouvez inclure votre profil bash ou un script d'alias séparé dans le script avec: shopt -s expand_aliases; source ~ / .bash_aliases
Johan
7
TERM=vt100 ssh some.host.name

À distance, exécutez echo $ TERM .

OG
la source
J'ai pensé à ce sujet, mais je veux qu'il ne soit défini que pour un sous-ensemble d'hôtes sur lequel je ssh, donc émettre TERM = ... ssh tout le temps ne fonctionnera pas. et se souvenir des hôtes qui ont d'anciennes informations de termcap, puis changer de commande à la volée n'est pas bien non plus.
La configuration par hôte n'est prise en charge que dans / etc / ssh / ssh_config, mais je ne connais aucune valeur de configuration pour prendre en charge le mappage de schéma de terminal par hôte.
OG
Cela peut également être fait dans ~ / .ssh / config, que je connais, mais je ne trouve pas non plus d'option pour modifier l'environnement envoyé au serveur distant. J'espérais avoir raté quelque chose.
7

homme 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).

Modifier:

Rats, j'espérais que ce pourrait être du côté local, mais s'il y a une volonté, il y a un moyen. 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.

En fonction de la configuration de sshd du côté réception, cela peut ou non répondre à l'exigence de "pas de modification de fichier à distance".

Paweł Brodacki
la source
1
Oui, mais c'est la configuration du côté distant, et j'ai besoin / veux quelque chose qui ne change que du côté local.
4
SendEnv n'est pas lié. Il peut éventuellement envoyer des variables env supplémentaires, mais: 1. il ne peut pas les modifier, et 2. TERM est quand même envoyé, même s'il n'est pas répertorié dans SendEnv.
5

Voici ma solution rapide et sale que je viens de jeter ensemble. Je préfère quelque chose de mieux. Je suppose que je pourrais utiliser un script shell à la place. L'ajustement des TERMvaleurs est laissé au lecteur comme exercice.

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

Idéalement, il ferait quelque chose comme vérifier les TERM de l'autre côté, en utilisant les ControlPersisttrucs pour éviter de longs retards pour plusieurs connexions.

docwhat
la source
Merci! J'ai fait quelque chose comme ça, mais au lieu de vérifier les valeurs spécifiques de $TERMavec une construction if/ else, j'utilise $(echo -n "$TERM" | sed -e s/tmux/screen/)pour remplacer inconditionnellement le "tmux" problématique dans mon terme local par le type "écran" plus universellement accepté ( source ici ).
wincent