如何将环境变量从sshd
的环境传递到新的 SSH 会话?
sshd
我在 Kubernetes Pod 中运行。 Kubernetes 在容器环境中设置各种变量,包括 API 服务器:KUBERNETES_PORT=tcp://100.64.0.1:443
现在,我的问题是这个环境变量没有传递给新的 SSH 会话,他们需要它来配置kubectl
.
答案1
可能有更好的方法来做到这一点,但快速的方法是使用SetEnv
来自命令行的指令sshd
:
export FOO=bar
sshd ... -o "SetEnv=FOO=$FOO" ...
export FOO=foo BAR='baz quux'
sshd ... -o "SetEnv=FOO=$FOO BAR=\"$BAR\"" ...
该SetEnv
指令自 OpenSSH 7.8 起受支持(使用 进行检查sshd -V
)。与所有-o key=val
选项一样,只有第一的将会被使用。
对于旧版本,您可以从用户的~/.ssh/rc
(PermitUserRC
)或来自登录 shell 的初始化文件:当通过 ssh 启动时,bash 源~/.bashrc
(以及之前的,在类似 Debian 的发行版上/etc/bash.bashrc
),即使在非交互模式下运行[1]。
不使用 PermitUserEnvironment
因为这允许用户绕过他们的登录 shell 和任何ForceCommand
via LD_PRELOAD
。
sshd
以普通用户运行的测试示例:
t=$(mktemp -d)
ssh-keygen -qN '' -f "$t/key"
export FOO=foo BAR='baz quux'
/usr/sbin/sshd -h "$t/key" -p 2222 -o "PidFile=$t/pid" \
-o "SetEnv=FOO=\"$FOO\" BAR=\"$BAR\""
连接到它
$ ssh -p 2222 localhost 'echo "$FOO" "$BAR"'
foo baz quux
您可以使用
alias ssh0='ssh -o UserKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no -o LogLevel=ERROR'
ssh0 ...
如果您想阻止 ssh 提示输入一次性密钥并将其添加到已知的主机文件中。
[1]Bash 通过检查SSH_CLIENT
和SHLVL
envvar 来确定它是否由 ssh 启动。这是另一种PermitUserEnvironment
可能“有用”的方法——绕过/etc/bash.bashrc
Debian 之类的发行版上的其他任何东西之前的来源:
$ bash -xc ''
<nothing>
$ SHLVL= SSH_CLIENT=foo bash -xc ''
+ case $- in
+ return
<stuff from /etb/bash.bashrc and ~/.bashrc>