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

Shu*_*eng 2 ssh debian sshd aws kubernetes

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

sshd在 Kubernetes pod 中运行。Kubernetes 在容器环境中设置了各种变量,包括 API 服务器:KUBERNETES_PORT=tcp://100.64.0.1:443

现在,我的问题是这个环境变量没有传递给新的 SSH 会话,他们需要它来配置kubectl.

mos*_*svy 5

可能有更好的方法来做到这一点,但一种快速的方法是使用SetEnv以下命令行中的指令sshd

export FOO=bar
sshd ... -o "SetEnv=FOO=$FOO" ...

export FOO=foo BAR='baz   quux'
sshd ... -o "SetEnv=FOO=$FOO BAR=\"$BAR\"" ...
Run Code Online (Sandbox Code Playgroud)

SetEnv自 OpenSSH 7.8 起支持该指令(请查看sshd -V)。与所有-o key=val选项一样,只会使用第一个

对于旧版本,您可以从用户~/.ssh/rc( PermitUserRC) 或登录 shell 的初始化文件中获取自动生成的文件:当通过 ssh 启动时,bash 源~/.bashrc(以及在它之前,在类似 Debian 的发行版上,/etc/bash.bashrc)即使在非交互模式[1]

不要使用, PermitUserEnvironment因为这允许用户绕过他们的登录 shell 和任何ForceCommand通过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\""
Run Code Online (Sandbox Code Playgroud)

连接到它

$ ssh -p 2222 localhost 'echo "$FOO" "$BAR"'
foo baz  quux
Run Code Online (Sandbox Code Playgroud)

您可以使用

alias ssh0='ssh -o UserKnownHostsFile=/dev/null \
    -o StrictHostKeyChecking=no -o LogLevel=ERROR'
ssh0 ...
Run Code Online (Sandbox Code Playgroud)

如果您想防止 ssh 提示输入一次性密钥并将其添加到已知主机文件中。


[1] Bash 通过检查SSH_CLIENTSHLVLenvvars来确定它是否由 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>
Run Code Online (Sandbox Code Playgroud)

  • 是的,旧版本的 openssh (&lt; 7.8) 不支持这一点。您通常不想运行旧版本的 sshd ;-) (2认同)