Debian

如何將環境變數從 sshd 的環境傳遞到新的 SSH 會話?

  • March 22, 2020

如何將環境變數從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\"" ...

從 OpenSSH 7.8 開始支持該SetEnv指令(檢查sshd -V)。與所有-o key=val選項一樣,只會使用第一個選項。

對於舊版本,您可以從使用者~/.ssh/rc(非互動模式PermitUserRC~/.bashrc``/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\""

連接到它

$ 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 $$SSH_CLIENTBash 通過檢查和SHLVLenvvars來確定它是否由 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>

引用自:https://unix.stackexchange.com/questions/573929