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指令。(您可以看到环境变量,包括来自 的环境变量,SetEnv在clientloop.c, function 中client_session2_setup单独发送。)
然后,在服务器侧,session.c的do_setup_env功能设置为在从客户端如何发送它相反的顺序新壳环境:第一它设置环境变量从s->env,然后将其设置TERM从PTY请求的TERM值(s->term),覆盖任何值forTERM作为普通环境变量发送。
由于服务器上操作的这个命令,一个SetEnv TERM将永远的值覆盖TERM在ssh客户端的环境,而不是从任何SetEnv。
在上述线程中,在这方面改变 OpenSSH 的行为似乎有很好的论据,但我认为没有任何行动。该线程中至少有一个人强烈认为远程主机的 init 文件应该在TERM需要时进行修改。(我个人不同意。)