I want to set the TERM environment variable to a different value for each of my remote machines, so i used SetEnv TERM=myTermForRemoteVar
in ~/.ssh/config
.
The remote machine still sees TERM=myLocalTermVar
.
I added AcceptEnv TERM
in /etc/ssh/sshd_config
on the remote machine. No luck still.
I tried just for testing purposes SetEnv FOO=smth
locally and AcceptEnv FOO
. This works perfectly and the remote machine sees FOO=smth
.
Is TERM
treated specially by ssh? SetEnv
works in general but not for TERM
. Anyone else seeing this behavior? It is not documented at least. Is this a bug?
Update: Since OpenSSH 8.7 (2021-08-20),
SetEnv TERM
is now supported:This thread on the openssh-unix-dev seems to indicate that
TERM
is indeed special, and you can't set it viaSetEnv
. Here's my reading of things:As noted in that thread, when the SSH client requests a new PTY from sshd, the request includes an explicit
TERM
value (see RFC4254, "The Secure Shell (SSH) Connection Protocol", section 6.2). This is separate from any environment variables the client wishes to send.In OpenSSH's
ssh.c
, functionssh_session2_setup
, OpenSSH unconditionally reads the PTY request'sTERM
value from your current environment, without any regard to anySetEnv
directives. (You can see environment variables, including those fromSetEnv
, being sent separately inclientloop.c
, functionclient_session2_setup
.)Then, on the server side,
session.c
'sdo_setup_env
function sets up the environment for the new shell in the reverse order from how the client sends it: first it sets environment variables froms->env
, then it setsTERM
from the PTY request'sTERM
value (s->term
), overwriting any value forTERM
sent as a normal environment variable.Because of this order of operations on the server, a
SetEnv TERM
will always be overridden by the value ofTERM
in thessh
client's environment, not from anySetEnv
.There seem to be good arguments for changing the behavior of OpenSSH in this regard in the aforementioned thread, but I take it no action came of it. At least one person in that thread felt strongly that the remote host's init files should be the one to modify
TERM
if needed. (I disagree, personally.)