如何将环境变量从 sshd 环境传递到新的 SSH 会话?

如何将环境变量从 sshd 环境传递到新的 SSH 会话?

如何将环境变量从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/rcPermitUserRC)或来自登录 shell 的初始化文件:当通过 ssh 启动时,bash 源~/.bashrc(以及之前的,在类似 Debian 的发行版上/etc/bash.bashrc),即使在非交互模式下运行[1]

不使用 PermitUserEnvironment因为这允许用户绕过他们的登录 shell 和任何ForceCommandvia 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_CLIENTSHLVLenvvar 来确定它是否由 ssh 启动。这是另一种PermitUserEnvironment可能“有用”的方法——绕过/etc/bash.bashrcDebian 之类的发行版上的其他任何东西之前的来源:

$ bash -xc ''
<nothing>
$ SHLVL= SSH_CLIENT=foo bash -xc ''
+ case $- in
+ return
<stuff from /etb/bash.bashrc and ~/.bashrc>

相关内容