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

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

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

私はsshdKubernetes ポッドで実行しています。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) またはログインシェルの初期化ファイルから: ssh経由で起動すると、非対話モードで実行されている場合でも、bashソース~/.bashrc(およびそれ以前のDebianのようなディストリビューションでは)が/etc/bash.bashrc[1]

使ってはいけません PermitUserEnvironmentForceCommandこうすることで、ユーザーはログイン シェルと をバイパスできるようになります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_CLIENTBash は、およびenvvarsをチェックして、ssh によって起動されたかどうかを判断しますSHLVL。これは、 Debian のようなディストリビューションで何よりも先にソース化されるPermitUserEnvironmentをバイパスする、もう 1 つの「便利な」方法です/etc/bash.bashrc

$ bash -xc ''
<nothing>
$ SHLVL= SSH_CLIENT=foo bash -xc ''
+ case $- in
+ return
<stuff from /etb/bash.bashrc and ~/.bashrc>

関連情報