
如何將環境變數從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/rc
(PermitUserRC
)或來自登入 shell 的初始化檔案:當透過 ssh 啟動時,bash 來源~/.bashrc
(以及先前的,在類似 Debian 的發行版上/etc/bash.bashrc
),即使在非互動模式下運行[1]。
不使用 PermitUserEnvironment
因為這允許使用者繞過他們的登入 shell 和任何ForceCommand
via 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_CLIENT
和SHLVL
envvar 來確定它是否由 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>