Ssh

SSH: TERM 變數的 SetEnv 行為

  • June 4, 2021

我想為我的每台遠端機器將 TERM 環境變數設置為不同的值,所以我SetEnv TERM=myTermForRemoteVar~/.ssh/config. 遠端機器仍然可以看到TERM=myLocalTermVar

AcceptEnv TERM/etc/ssh/sshd_config遠端機器上添加了。還是沒有運氣。

我嘗試僅用於SetEnv FOO=smth本地測試目的,並且AcceptEnv FOO. 這完美地工作,遠端機器可以看到FOO=smth

TERMssh特別對待?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.cdo_setup_env函式以與客戶端發送它的相反順序為新 shell 設置環境:首先它從設置環境變數s->env然後TERM從 PTY 請求的TERM值 ( s->term) 設置,覆蓋任何值作為TERM普通環境變數發送。

由於伺服器上的這種操作順序,aSetEnv TERM將始終被客戶端環境TERM中的值覆蓋ssh,而不是來自任何SetEnv.

在上述執行緒中,似乎有很好的論據來改變 OpenSSH 在這方面的行為,但我認為它沒有採取任何行動。該執行緒中至少有一個人強烈認為遠端主機的 init 文件應該是TERM需要修改的文件。(我個人不同意。)

引用自:https://serverfault.com/questions/986847