背景
SSH連接時有時需要自動設(shè)置特定的環(huán)境變量,如LANG等碍侦。如果您使用專用的圖形化SSH終端,如XShell之類的工具隶糕,可以直接在相應(yīng)軟件的連接配置文件里設(shè)置瓷产。這里記錄的是直接在終端使用SSH命令連接的情況下,發(fā)送環(huán)境變量的兩種方法(SendEnv和SetEnv)枚驻。
SendEnv需要提供一個或多個本地已存在的環(huán)境變量名濒旦,將本地環(huán)境變量發(fā)送到遠程主機上去;SetEnv可以直接指定一個新的環(huán)境變量名和值設(shè)置到遠程主機上再登。
設(shè)置方法
1. 如果你在使用ssh config配置文件(~/.ssh/config)尔邓,格式如下:
Host myserver
? ? ? ? ...
????????SendEnv=LC_MYVAR? ? ? ?
????????SetEnv LC_ALL=zh_CN.utf8 ? ? ??
2. 如果你想在命令行場景下中使用,格式如下[1]:
ssh -o SendEnv=LC_MYVAR?-o SetEnv="LC_ALL=zh_CN.utf8"?example.com
3. 也可以通過添加K=V格式的環(huán)境變量到~/.ssh/environment文件來設(shè)置對所有SSH主機都要應(yīng)用的環(huán)境變量锉矢,但是這些環(huán)境變量仍然受到服務(wù)器sshd設(shè)置中AcceptEnv的限制梯嗽。
注意事項
1. SetEnv是OpenSSH 7.8新增加的特性,發(fā)布于2018年沽损。而SendEnv早就已經(jīng)普遍支持灯节。
2. 有些極特殊的環(huán)境變量如(TERM)暫時還不能通過SetEnv/SendEnv設(shè)置,見文章[2]。
3. 你想要設(shè)置的變量炎疆,必須在服務(wù)端/etc/ssh/sshd_config里用AcceptEnv明確允許接收卡骂。如果要設(shè)置的變量不在其中,需要在sshd配置里加入磷雇,或者利用PermitUserEnvironment配置項詳細配置偿警,或者看下面一條注意事項中的間接繞過方法。
實測默認允許接收的變量如下:
CentOS 8
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES?
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT?
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS?
Ubuntu 16.04 /?MacOS 11.3
AcceptEnv LANG LC_*
4. 另一種發(fā)送環(huán)境變量的思路是設(shè)置連接后自動執(zhí)行的命令去export變量(類似于文章[1]中提到的workaround)唯笙。也可以考慮利用RemoteCommand配置項螟蒸,但可能有其他問題,如運行ssh hostname command格式的(非交互式shell)命令時可能會報錯崩掘。見文章[3]提到的問題七嫌。