sshd
の環境から新しいSSHセッションに環境変数を渡すにはどうすればよいですか?
Kubernetesポッドでsshd
を実行しています。 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\"" ...
SetEnv
ディレクティブは、OpenSSH 7.8以降でサポートされています(sshd -V
で確認してください)。すべての-o key=val
オプションと同様に、firstのみが使用されます。
古いバージョンでは、ユーザーの~/.ssh/rc
( PermitUserRC
)またはログインシェルの初期化ファイルから自動生成ファイルを入手できます。ssh経由で起動した場合、非対話型モードで実行されている場合でも、bashソースは~/.bashrc
(およびその前は、Debianのようなディストリビューションでは/etc/bash.bashrc
)[1]。
使用しないPermitUserEnvironment
これにより、ユーザーはLD_PRELOAD
を介してログインシェルとForceCommand
をバイパスできます。
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が既知のhostsファイルに使い捨てキーを要求して追加するのを防ぎたい場合。
[1] Bashは、SSH_CLIENT
およびSHLVL
envvarsをチェックすることにより、sshによって開始されたかどうかを判別します。これは、PermitUserEnvironment
が「便利」な別の方法です。Debianのようなディストリビューションで他の何よりも先に供給される/etc/bash.bashrc
をバイパスするためです。
$ bash -xc ''
<nothing>
$ SHLVL= SSH_CLIENT=foo bash -xc ''
+ case $- in
+ return
<stuff from /etb/bash.bashrc and ~/.bashrc>