web-dev-qa-db-ja.com

sshdの環境から新しいSSHセッションに環境変数を渡すにはどうすればよいですか?

sshdの環境から新しいSSHセッションに環境変数を渡すにはどうすればよいですか?

Kubernetesポッドでsshdを実行しています。 Kubernetesは、APIサーバーを含むコンテナ環境にさまざまな変数を設定します。KUBERNETES_PORT=tcp://100.64.0.1:443

さて、私の問題は、この環境変数が新しいSSHセッションに渡されず、kubectlを構成するために必要になることです。

1
Shuzheng

これを行うにはもっと良い方法があるかもしれませんが、簡単な方法は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/rcPermitUserRC )またはログインシェルの初期化ファイルから自動生成ファイルを入手できます。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>
4
mosvy