Question Est-il possible de changer la valeur de $ TERM en appelant ssh?


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

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


18
2017-08-17 16:37


origine




Réponses:


TERM=vt100 ssh some.host.name

Sur la télécommande, exécutez echo $ TERM.


6
2017-08-17 16:41



J'y ai réfléchi, mais je veux qu'il soit défini uniquement pour un sous-ensemble d'hôtes sur lequel je ssh, donc émettre TERM = ... ssh tout le temps ne fonctionnera pas. et se rappeler quels hôtes ont les anciennes informations termcap, et changer de commande à la volée n’est pas non plus agréable.
La configuration par hôte est prise en charge uniquement dans / etc / ssh / ssh_config. Cependant, je ne connais aucune valeur de configuration pour prendre en charge le mappage de schéma de terminal par hôte. - O G
Cela peut également être fait dans ~ / .ssh / config, ce que je sais, mais je ne trouve également aucune option pour modifier l’environnement envoyé au serveur distant. J'espérais avoir manqué quelque chose.


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

# Force xterm-color on ssh sessions
alias ssh='TERM=xterm-color ssh'

6
2017-11-30 10:11



Cela fonctionne si j'utilise ssh depuis un terminal. Mais j'ai aussi 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 distinct pour chacun d'eux? - Thayne
Si votre script nécessite une valeur TERM spécifique, je pense qu'il serait préférable de 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. En outre, ces scripts sélectionnent un serveur en fonction de certains paramètres et ouvrent une session SSH sur ce serveur (ou éventuellement sur 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


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:

Les rats, j'espérais que ça pourrait être du côté local, quand même, 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é de la réception, cela peut ou non satisfaire à l'exigence de "pas de modification de fichier distant".


5
2017-08-17 16:43



Oui, mais il s’agit d’une configuration côté distant et j’ai besoin / je veux quelque chose qui ne change que localement.
SendEnv n'est pas lié. Ça peut peut-être envoie 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 ne figure pas dans SendEnv.


Voici ma solution rapide et sale que je viens de jeter ensemble. Je préférerais quelque chose de mieux. Je suppose que je pourrais utiliser un script shell à la place. Ajustement TERM valeurs est laissée comme un exercice au lecteur.

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

Idéalement, cela ressemblerait à vérifier les TERM de l’autre côté, en utilisant le ControlPersist trucs pour éviter les longs délais pour plusieurs connexions.


5
2018-01-19 03:20



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