SSH: TERM 变量的 SetEnv 行为

Laz*_*535 9 ssh environment-variables

我想为我的每台远程机器将 TERM 环境变量设置为不同的值,所以我SetEnv TERM=myTermForRemoteVar~/.ssh/config. 远程机器仍然可以看到TERM=myLocalTermVar

AcceptEnv TERM/etc/ssh/sshd_config远程机器上添加了。仍然没有运气。

我只是为了测试目的而尝试在SetEnv FOO=smth本地和AcceptEnv FOO. 这工作得很好,远程机器可以看到FOO=smth.

TERM通过SSH特殊处理?SetEnv一般适用,但不适用于TERM. 还有其他人看到这种行为吗?至少没有记录。这是一个错误吗?

dse*_*vec 10

2021 年 6 月 4 日更新: “允许 ssh_config SetEnv覆盖 $TERM”刚刚提交给 openssh-portable。我想这是不是在释放,但我认为,这意味着,在不久的将来十岁上下,我们应该能够覆盖TERM~/.ssh/config


openssh-unix-dev 上的这个线程似乎表明这TERM确实很特别,您无法通过SetEnv. 这是我对事物的阅读:

如该线程所述,当 SSH 客户端从 sshd 请求新的 PTY 时,该请求包含一个显式TERM值(请参阅RFC4254,“安全外壳 (SSH) 连接协议”,第 6.2 节)。这与客户端希望发送的任何环境变量是分开的。

在 OpenSSH 的ssh.c, 函数 中ssh_session2_setup,OpenSSH 无条件地TERM从您当前的环境中读取 PTY 请求的值,而不考虑任何SetEnv指令。(您可以看到环境变量,包括来自 的环境变量,SetEnvclientloop.c, function 中client_session2_setup单独发送。)

然后,在服务器侧,session.cdo_setup_env功能设置为在从客户端如何发送它相反的顺序新壳环境:第一它设置环境变量从s->env然后将其设置TERM从PTY请求的TERM值(s->term),覆盖任何值forTERM作为普通环境变量发送。

由于服务器上操作的这个命令,一个SetEnv TERM将永远的值覆盖TERMssh客户端的环境,而不是从任何SetEnv

在上述线程中,在这方面改变 OpenSSH 的行为似乎有很好的论据,但我认为没有任何行动。该线程中至少有一个人强烈认为远程主机的 init 文件应该在TERM需要时进行修改。(我个人不同意。)