Impedire al client SSH di passare la variabile d'ambiente TERM al server?


20

Attualmente sto usando Fedora 18 gnome-terminal , quindi ho avviato il tmuxmultiplexer. Dopo essermi connesso a un server CentOS 5 tramite sshcomando, ho trovato:

  • ls il risultato non ha colore
  • tmux, screen, hexedit, htopTutti falliti per iniziare con il messaggio di errore del tipo:
    terminale aperto non riuscito: terminale mancante o inadatto: schermo-256 colori

Sembra che sshpassi la variabile d'ambiente $ TERM al server, ma non riesco a trovarla nel /etc/ssh/ssh_configfile di Fedora 18.

Anche se posso modificare manualmente la variabile $ TERM sul server, ogni volta che mi collego, succede di nuovo. Quindi come prevenirlo?

Risposte:


17

$TERM è dire alle applicazioni con quale terminale stanno parlando in modo che sappiano come parlarci.

Modificalo in un valore supportato dall'host remoto e che corrisponda il più vicino possibile al tuo terminale ( screen).

La maggior parte dei sistemi Linux dovrebbe avere almeno una screenvoce terminfo. In caso contrario, screenimplementa un superset di vt100ed vt100è universale. Così:

TERM=screen ssh host

o

TERM=vt100 ssh host

Se hai bisogno del supporto per 256 colori, potresti provare xterm-256colorquale dovrebbe essere abbastanza vicino ( screensupporta 256 colori nello stesso modo xterm) e dire alle applicazioni che l'applicazione terminale supporta 256 colori e dire loro come usarli.

Oppure puoi installare la voce terminfo sull'host remoto.

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

2
buono a sapersi infocmpe tic, una volta compilato, non è necessario modificarlo $TERMnuovamente temporaneamente . a proposito, ho appena copiato (rsync) /usr/share/terminfo/s/screen-256colorda Fedora 18 a CentOS, sembra funzionare bene ( rsync -tv /usr/share/terminfo/s/screen-256color root@the_host:/usr/share/terminfo/s).
LiuYan 刘 研

Ho dimenticato di menzionare, ho corso tmuxnel terminale gnome di Fedora 18, ho tmuxcambiato il $TERMvalore screen-256colorda xterm-256color.
LiuYan 刘 研

tra l'altro, ssh funziona in questo modo: ottenere il terminfo quale host / server supportato (non inserito), quindi prelevarne uno che il terminale client può supportare?
LiuYan 刘 研

2
infocmp | ssh -t root@remote-host 'cat > "$TERM.info" && tic "$TERM.info"'può essere abbreviato in infocmp | ssh root@remote-host "tic -". Questo funziona perché quando si dispone di una pipe è possibile accedervi come file utilizzando - e fortunatamente le pipe funzionano su SSH.
Alan Jenkins,

1
@starfry, non posso darti alcuna garanzia che il formato binario dei ticfile generati (compilatore terminfo) sarà lo stesso da un sistema all'altro o che la loro posizione sarà la stessa. ticpuò anche assicurarsi che le autorizzazioni siano corrette o creare directory intermedie dove necessario.
Stéphane Chazelas,

10

Nel mio caso ho semplicemente aggiunto un alias al mio .zshrc( .bashrcse utilizzo bash) sul mio desktop locale:

alias ssh='TERM=xterm ssh'

Se si utilizza già un alias, modificarlo per includere l'assegnazione Ambiente.


1

Ho inserito questo nel mio .bashrchost 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

In questo modo, entrambi xterm-256colore screen-265colorvengono gestiti correttamente. Inoltre, ho emesso la nota in modo che se il server viene aggiornato successivamente e supporta 256 colori, non finirò per sbattere la testa contro il muro chiedendomi perché la mia variabile TERM viene cambiata quando SSHing.


Oppure, non avviare una subshell e un altro processo:export TERM=${TERM%%-256color}
miken32

1

Il cambiamento $TERMpotrebbe funzionare, ma non lo suggerisco, è solo una soluzione alternativa anziché una soluzione.

Quando riscontro questo problema sui miei sistemi, lo risolvo installando il supporto per i tipi di terminali più comuni sul sistema remoto:

  • yum install ncurses-baseper screen-256colorsu CentOS
  • yum install ncurses-termper screen-256color-bcesu CentOS
  • apt install ncurses-baseper entrambi screen-256colore screen-256color-bcesu Debian, Ubuntu e Mint

I pacchetti relativi a ncurses forniscono anche supporto per molti altri terminali e sono disponibili anche su tutte le altre grandi distribuzioni. (Ma per il mio caso d'uso e la tua domanda dovrebbero essere sufficienti informazioni)


0

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

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

In base a ciò, il valore predefinito non dovrebbe essere l'invio di variabili, ma TERM sembra essere speciale. Viene comunque inviato.

Pertanto è possibile modificare TERM quando si chiama ssh (come TERM=xterm ssh ... ), cambiarlo dopo il login (come in .bash_profile), o definire il tipo di TERM sconosciuto sul lato server (supponendo che tu abbia accesso root lì). Vedi altra risposta per i dettagli.


1
Non impostare $TERMnon sarà in realtà meglio di impostarlo su un valore non supportato.
Stéphane Chazelas l'

La domanda letterale era: come impedire l'invio di TERM. - Risposta: non puoi. - Quello che dovrebbe fare è impostarlo su un valore adatto, sì.
michas,

il cambiamento $TERMtemporaneamente può essere una soluzione alternativa, ma devo farlo ogni volta. tra l'altro, sembra che sia CentOS 5 e Fedora 18 Accetta Env tutte le variabili d'ambiente locale ( LANG, LC_*, ...)
LiuYan刘研
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.