SSH: TERM 變數的 SetEnv 行為
我想為我的每台遠端機器將 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
. 還有其他人看到這種行為嗎?至少沒有記錄。這是一個錯誤嗎?
2021-06-04 更新: “允許 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
, functionssh_session2_setup
中,OpenSSH 無條件地從您目前的環境中讀取 PTY 請求的TERM
值,而不考慮任何SetEnv
指令。(您可以看到環境變數,包括來自 的環境變數,SetEnv
分別在clientloop.c
, 函式client_session2_setup
中發送。)然後,在伺服器端,
session.c
的do_setup_env
函式以與客戶端發送它的相反順序為新 shell 設置環境:首先它從設置環境變數s->env
,然後TERM
從 PTY 請求的TERM
值 (s->term
) 設置,覆蓋任何值作為TERM
普通環境變數發送。由於伺服器上的這種操作順序,a
SetEnv TERM
將始終被客戶端環境TERM
中的值覆蓋ssh
,而不是來自任何SetEnv
.在上述執行緒中,似乎有很好的論據來改變 OpenSSH 在這方面的行為,但我認為它沒有採取任何行動。該執行緒中至少有一個人強烈認為遠端主機的 init 文件應該是
TERM
需要修改的文件。(我個人不同意。)