Empêcher le client SSH de transmettre la variable d'environnement TERM au serveur?

21

J'utilise actuellement Fedora 18 gnome-terminal , puis j'ai démarré le tmuxmultiplexeur. Après m'être connecté à un serveur CentOS 5 via une sshcommande, je trouve:

  • ls le résultat n'a pas de couleur
  • tmux, screen, hexedit, htopTout n'a pas pu démarrer avec le message d'erreur comme:
    échec du terminal ouvert: terminal manquant ou inadapté: screen-256color

Il semble que sshla variable d'environnement $ TERM soit transmise au serveur, mais je ne la trouve pas dans le /etc/ssh/ssh_configfichier de Fedora 18.

Bien que je puisse modifier manuellement la variable $ TERM sur le serveur, chaque fois que je me connecte, cela se reproduit. Alors comment l'empêcher?

LiuYan 刘 研
la source

Réponses:

18

$TERM est de dire aux applications à quel terminal elles parlent pour qu'elles sachent comment lui parler.

Remplacez-le par une valeur prise en charge par l'hôte distant et qui correspond le plus possible à votre terminal ( screen).

La plupart des systèmes Linux devraient au moins avoir une screenentrée terminfo. Sinon, screenimplémente un sur-ensemble de vt100et vt100est universel. Donc:

TERM=screen ssh host

ou

TERM=vt100 ssh host

Si vous avez besoin de la prise en charge de 256 couleurs, vous pouvez essayer celle xterm-256colorqui devrait être suffisamment proche ( screenprend en charge 256 couleurs de la même manière xterm) et indiquer aux applications que votre application de terminal prend en charge 256 couleurs et leur expliquer comment les utiliser.

Ou vous pouvez installer l'entrée terminfo sur l'hôte distant.

infocmp -x | ssh -t root@remote-host '
  cat > "$TERM.info" && tic -x "$TERM.info"'
Stéphane Chazelas
la source
2
bon à savoir infocmpet tic, une fois compilé, pas besoin de changer à $TERMnouveau temporairement . par ailleurs, je viens de copier (rsync) /usr/share/terminfo/s/screen-256colorde Fedora 18 vers CentOS, il semble que ça marche ( rsync -tv /usr/share/terminfo/s/screen-256color root@the_host:/usr/share/terminfo/s).
LiuYan 刘 研
oublié de mentionné, je courus tmuxdans gnome-terminal de Fedora 18, tmuxchangé de la $TERMvaleur à screen-256colorpartir de xterm-256color.
LiuYan 刘 研
btw, ssh peut-il fonctionner de cette manière: obtenir le terminfo sur quel hôte / serveur pris en charge (pas poussé), puis en choisir un que le terminal client peut prendre en charge?
LiuYan 刘 研
2
infocmp | ssh -t root@remote-host 'cat > "$TERM.info" && tic "$TERM.info"'peut être raccourci infocmp | ssh root@remote-host "tic -". Cela fonctionne parce que lorsque vous avez un canal, il est accessible en tant que fichier en utilisant - et heureusement, les canaux fonctionnent sur SSH.
Alan Jenkins
1
@starfry, je ne peux vous donner aucune garantie que le format binaire des ticfichiers générés (compilateur terminfo) sera le même d'un système à l'autre ou que leur emplacement sera le même. ticpeut également s'assurer que les autorisations sont correctes ou créer des répertoires intermédiaires si nécessaire.
Stéphane Chazelas
10

Dans mon cas, j'ai simplement ajouté un alias à mon .zshrc( .bashrcsi vous utilisez bash) sur mon bureau local:

alias ssh='TERM=xterm ssh'

Si vous utilisez déjà un alias, ajustez-le pour inclure l'affectation d'environnement.

zaTricky
la source
1

Je mets ceci dans mon .bashrcsur l'hôte distant:

# 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 cette façon, les deux xterm-256coloret screen-265colorsont gérés correctement. En outre, je l'ai sorti la note de sorte que si le serveur est mis à niveau plus tard et prend en charge 256 couleurs, je ne vais pas me cogner la tête contre le mur en me demandant pourquoi ma variable TERM est modifiée lors de la SSHing.

depquid
la source
Ou, ne démarrez pas un sous-shell et un autre processus:export TERM=${TERM%%-256color}
miken32
1

Changer $TERMpourrait fonctionner, mais je ne le suggère pas, c'est seulement une solution de contournement au lieu d'une solution.

Lorsque je rencontre ce problème sur mes systèmes, je le résout en installant la prise en charge des types de terminaux les plus courants sur le système distant:

  • yum install ncurses-basepour screen-256colorsur CentOS
  • yum install ncurses-termpour screen-256color-bcesur CentOS
  • apt install ncurses-basepour les deux screen-256coloret screen-256color-bcesur Debian, Ubuntu et Mint

Les packages liés à ncurses prennent également en charge de nombreux autres terminaux, et ils sont également disponibles sur toutes les autres grandes distributions. (Mais pour mon cas d'utilisation et votre question, cela devrait suffire)

Garo
la source
0

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

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

Selon cela, la valeur par défaut devrait être de n'envoyer aucune variable, mais TERM semble être spécial. C'est envoyé quand même.

Par conséquent, vous pouvez soit changer TERM lors de l'appel de ssh (comme TERM=xterm ssh ...), le changer après la connexion (comme dans .bash_profile), soit définir le type TERM inconnu côté serveur (en supposant que vous y ayez un accès root). Voir l'autre réponse pour plus de détails.

michas
la source
1
Cependant, $TERMne pas définir ne sera pas vraiment mieux que de le définir sur une valeur non prise en charge.
Stéphane Chazelas
La question littérale était de savoir comment empêcher l'envoi de TERM. - Réponse: vous ne pouvez pas. - Ce qu'il devrait faire, c'est le mettre à une valeur appropriée, oui.
michas
changer $TERMtemporairement peut être une solution de contournement, mais je dois le faire à chaque fois. par ailleurs, il semble que les deux CentOS 5 et Fedora 18 Encaisser Env toutes les variables d'environnement local ( LANG, LC_*...)
Liuyan刘研