È possibile cambiare il valore di $ TERM quando si chiama ssh?


21

Sul mio terminale locale, ho TERM = konsole-256color, ma non tutte le macchine remote che mi collegano per avere questa definizione.

È possibile fare in modo che ssh cambi il TERM sulla macchina remota? Senza cambiare gli script .bash * sul computer remoto, cambiando semplicemente la configurazione sul mio desktop locale?

Risposte:


9

Ho aggiunto il seguente alias al mio file .bashrc. Usa la risposta di OG ma la avvolge in un alias. Funziona come un fascino;)

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

Funziona se uso ssh da un terminale. Ma ho anche diversi script che eseguono ssh e l'alias non è espanso per loro. Esiste un modo per evitare di creare un alias separato per ciascuno di essi?
Thayne,

Se il tuo script necessita di un valore TERM specifico, penso che sarebbe meglio impostare quella variabile nello script stesso. O non è un'opzione?
Johan,

Questa non è davvero un'opzione. Inoltre, questi script selezionano un server in base ad alcuni parametri e aprono una sessione ssh su quel server (o eventualmente server in una sessione tmux), gli script stessi non dipendono dal valore TERM.
Thayne,

In tal caso, potresti includere il tuo profilo bash o uno script alias separato nello script con: shopt -s expand_aliases; fonte ~ / .bash_aliases
Johan,

7
TERM=vt100 ssh some.host.name

Sul telecomando, eseguire echo $ TERM .


Ci ho pensato, ma lo voglio impostato solo per un sottoinsieme di host a cui ho scritto, quindi l'emissione TERM = ... ssh tutto il tempo non funzionerà. e ricordare quali host hanno vecchie informazioni sul termcap, e quindi anche cambiare il comando al volo non è carino.

La configurazione per host è supportata solo in / etc / ssh / ssh_config, tuttavia non conosco alcun valore di configurazione per supportare la mappatura dello schema terminale per host.
OG,

Può anche essere fatto in ~ / .ssh / config, che conosco, ma non riesco a trovare alcuna opzione per modificare l'ambiente inviato al server remoto. Speravo che mi mancasse qualcosa.

7

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

Modificare:

Ratti, speravo che potesse essere sul lato locale, tuttavia, se c'è una volontà, c'è un modo. 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.

A seconda della configurazione di sshd sul lato ricevente, ciò può o non può soddisfare il requisito di "nessuna modifica al file remoto".


1
Sì, ma questa è la configurazione sul lato remoto, e ho bisogno / voglio qualcosa che cambi solo sull'estremità locale.

4
SendEnv non è correlato. Può eventualmente inviare variabili env aggiuntive, ma: 1. non può modificarle e 2. TERM viene comunque inviato, anche se non è elencato in SendEnv.

5

Ecco la mia soluzione rapida e sporca che ho appena messo insieme. Preferirei qualcosa di meglio. Immagino di poter usare invece uno script di shell. La regolazione dei TERMvalori viene lasciata come esercizio al lettore.

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

Idealmente, farebbe qualcosa come controllare i TERM dall'altra parte, usando le ControlPersistcose per evitare lunghi ritardi per connessioni multiple.


Grazie! Ho fatto qualcosa del genere, ma invece di verificare valori specifici di $TERMcon un if/ elsecostrutto, sto usando $(echo -n "$TERM" | sed -e s/tmux/screen/)per sostituire incondizionatamente il problematico "tmux" nel mio termine locale con il tipo di "schermo" più universalmente accettato ( fonte qui ).
Wincent,
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.