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
.
可能有更好的方法来做到这一点,但一种快速的方法是使用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_CLIENT
和SHLVL
envvars来确定它是否由 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)