Debian
如何將環境變數從 sshd 的環境傳遞到新的 SSH 會話?
如何將環境變數從
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_CLIENT
Bash 通過檢查和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>