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

相關內容