É possível alterar o valor de $ TERM ao chamar ssh?

21

No meu terminal local, tenho TERM = konsole-256color, mas nem todas as máquinas remotas que conecto para ter essa definição.

É possível fazer com que o ssh altere o TERM na máquina remota? Sem alterar os scripts .bash * na máquina remota, apenas alterando a configuração na área de trabalho local?


fonte

Respostas:

9

Eu adicionei o seguinte alias ao meu arquivo .bashrc. Ele usa a resposta da OG, mas a envolve em um pseudônimo. Funciona como um encanto ;)

# Force xterm-color on ssh sessions
alias ssh='TERM=xterm-color ssh'
Johan
fonte
Isso funciona se eu usar o ssh de um terminal. Mas também tenho vários scripts que executam ssh, e o alias não é expandido para eles. Existe alguma maneira de evitar criar um alias separado para cada um deles?
Thayne
Se o seu script precisar de um valor TERM específico, acho que seria melhor apenas definir essa variável no próprio script. Ou isso não é uma opção?
Johan Johan
Isso não é realmente uma opção. Além disso, esses scripts selecionam um servidor com base em alguns parâmetros e abrem uma sessão ssh para esse servidor (ou possivelmente servidores em uma sessão tmux), os scripts em si não dependem do valor TERM.
Thayne
Nesse caso, você pode incluir seu perfil bash ou um script de aliases separado no script com: shopt -s expand_aliases; source ~ / .bash_aliases
Johan
7
TERM=vt100 ssh some.host.name

No controle remoto, execute echo $ TERM .

OG
fonte
Eu pensei sobre isso, mas eu quero que ele seja definido apenas para um subconjunto de hosts aos quais ssh, portanto, emitir TERM = ... ssh o tempo todo não funcionará. e lembrar quais hosts possuem informações antigas sobre termcap e, em seguida, alterar o comando rapidamente também não é bom.
A configuração por host é suportada apenas em / etc / ssh / ssh_config, no entanto, não conheço nenhum valor de configuração para suportar o mapeamento de esquema do terminal por host.
OG
Isso também pode ser feito em ~ / .ssh / config, que eu conheço, mas também não consigo encontrar nenhuma opção para modificar o ambiente enviado ao servidor remoto. Estava esperando que eu perdesse alguma coisa.
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).

Editar:

Ratos, eu esperava que pudesse ser do lado local, ainda assim, se houver vontade, há um caminho. 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.

Dependendo da configuração do sshd no lado receptor, isso pode ou não atender ao requisito de "nenhuma modificação remota de arquivo".

Paweł Brodacki
fonte
1
Sim, mas essa é a configuração no lado remoto, e eu preciso / quero algo que mude apenas no local.
4
SendEnv não está relacionado. É possível enviar variáveis ​​env adicionais, mas: 1. ele não pode modificá-las e 2. TERM é enviado de qualquer maneira, mesmo que não esteja listado em SendEnv.
5

Aqui está a minha solução rápida e suja que acabei de juntar. Eu preferiria algo melhor. Eu acho que eu poderia usar um script de shell em seu lugar. O ajuste de TERMvalores é deixado como um exercício para o leitor.

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

Idealmente, faria algo como verificar os TERMs do outro lado, usando o ControlPersistmaterial para evitar atrasos longos em várias conexões.

docwhat
fonte
Obrigado! Eu fiz algo parecido com isto, mas em vez de verificar valores específicos de $TERMcom um if/ elseconstruct, estou usando $(echo -n "$TERM" | sed -e s/tmux/screen/)para substituir incondicionalmente o problemático "tmux" no meu termo local pelo tipo de "tela" mais universalmente aceito ( fonte aqui ).
Wincent