
sshd
の環境から新しい SSH セッションに環境変数を渡すにはどうすればよいですか?
私はsshd
Kubernetes ポッドで実行しています。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
) またはログインシェルの初期化ファイルから: ssh経由で起動すると、非対話モードで実行されている場合でも、bashソース~/.bashrc
(およびそれ以前のDebianのようなディストリビューションでは)が/etc/bash.bashrc
[1]。
使ってはいけません PermitUserEnvironment
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 は、および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>