我想通过 ssh 发送一些环境变量。我修改了服务器上的 sshd_config,在 /etc/ssh/sshd_config.d 中添加了一个文件,其中包含:
# NB This DOES NOT conflict with PermitUserEnvironment=No
AcceptEnv NOTIF* LANG LC_*
并重新启动 sshd。运行ssh -o SendEnv=NOTIF* localhost printenv
变量未在远程端设置。
/etc/ssh/sshd_config 中已有一个包含 的条目AcceptEnv LANG LC_*
。注释掉 + 重新启动对行为没有影响。
$ export NOTIFY_WHAT="SERVICE"
$ export NOTIFY_SHORTDATETIME="CRIT"
$ export NOTIFY_HOSTNAME="web.example.com"
$ export NOTIFY_HOSTOUTPUT="host is up"
$ export NOTIFY_HOSTSTATE="OK"
$ export NOTIFY_NOTIFICATIONTYPE="PROBLEM"
$ export NOTIFY_SERVICEDESC="cmk-test"
$ export NOTIFY_SERVICEOUTPUT="oh no its broken!"
$ export NOTIFY_SERVICESTATE="CRIT"
$ ssh -o SendEnv=NOTIF* localhost printenv
SHELL=/bin/bash
LANGUAGE=en_US.UTF-8
SSH_AUTH_SOCK=/tmp/ssh-XXXXIxNz4o/agent.8579
PWD=/home/symcbean
LOGNAME=symcbean
MOTD_SHOWN=pam
HOME=/home/symcbean
LANG=C.UTF-8
SSH_CONNECTION=127.0.0.1 35340 127.0.0.1 22
USER=symcbean
SHLVL=0
SSH_CLIENT=127.0.0.1 35340 22
LC_ALL=C
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games
_=/usr/bin/printenv
因此它不起作用,但奇怪的是,发送了一个修改后的 LANG:
$ export LANG=en_GB.UTF-8
$ ssh -o SendEnv=NOTIF* localhost printenv
SHELL=/bin/bash
LANGUAGE=en_US.UTF-8
SSH_AUTH_SOCK=/tmp/ssh-XXXXIxNz4o/agent.8579
PWD=/home/symcbean
LOGNAME=symcbean
MOTD_SHOWN=pam
HOME=/home/symcbean
LANG=en_GB.UTF-8
SSH_CONNECTION=127.0.0.1 35340 127.0.0.1 22
USER=symcbean
SHLVL=0
SSH_CLIENT=127.0.0.1 35340 22
LC_ALL=C
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games
_=/usr/bin/printenv
(虽然我使用本地主机连接,但客户端和服务器在单独的 WSL 容器上运行。客户端是 1:8.9p1-3ubuntu0.7,服务器是 openssh-server 1:9.2p1-2+deb12u3)。
为了不引起歧义:
$ ssh -o SendEnv=NOTIF* localhost 'find /etc/ssh -type f -exec grep -H AcceptEnv {} \;'
grep: /etc/ssh/ssh_host_ed25519_key: Permission denied
grep: /etc/ssh/ssh_host_rsa_key: Permission denied
grep: /etc/ssh/ssh_host_ecdsa_key: Permission denied
/et`c/ssh/sshd_config.d/allowcheckmk:AcceptEnv NOTIF* LANG LC_*
/etc/ssh/sshd_config:# AcceptEnv LANG LC_*
更新
我-vv
可以看到客户端似乎正在发送数据 - 它没有被接受/在远程端被丢弃......
debug1: Sending environment.
debug1: channel 2: setting env NOTIFY_SERVICESTATE = "CRIT"
debug2: channel 2: request env confirm 0
debug1: channel 2: setting env NOTIFY_HOSTSTATE = "OK"
debug2: channel 2: request env confirm 0
debug1: channel 2: setting env NOTIFY_WHAT = "SERVICE"
debug2: channel 2: request env confirm 0
...
要将环境变量从客户端传递到服务器,您需要:
SendEnv
在客户端使用AcceptEnv
在服务器端使用(正如您所注意到的,有一个相关但不同的
PermitUserEnvironment
指令:这会从其他来源添加到环境中。)捕熊陷阱包括:
sshd_config
配置未被(完全)读取,或更改后未重新加载AcceptEnv
(或Include
)意外出现在Match
指令之后您可以使用 config-test 模式测试服务器是否设置正确:
(配置解析时不区分大小写)
如果您添加
-dd
设置调试级别 2,您还会看到Include
相关详细信息:对于你的情况,可能是:
测试模式
-T
读取当前配置文件,如果配置发生变化,请确保重新加载服务。(如果您确实
Match
为此使用了指令,则可以使用以及测试条件——-C ...
有关-T
详细信息,请查看 sshd 手册页。)您可以通过运行一次性调试级别 2 来查看整个过程
sshd
:(当客户端断开连接时,此调试服务器进程将退出)
在连接后的服务器输出中您将看到“
debug2: Setting env 0: ...
”,并且在成功登录后的客户端输出中它将显示所做的环境更改。允许的变量数量存在故障安全限制(从 openssh-9.7p1 开始,它是硬编码的 128)。
据我所知,只有
TERM
变量是特殊情况,因为它需要由协议发送。要解释LANG
变化,也许pam_env
系统 rc 脚本会引导您进入那个兔子洞……