
Wie kann ich Umgebungsvariablen aus sshd
der Umgebung an neue SSH-Sitzungen übergeben?
Ich verwende sshd
Kubernetes-Pods. Kubernetes legt verschiedene Variablen in der Containerumgebung fest, einschließlich des API-Servers:KUBERNETES_PORT=tcp://100.64.0.1:443
Nun besteht mein Problem darin, dass diese Umgebungsvariable nicht an neue SSH-Sitzungen übergeben wird, diese sie aber für die Konfiguration benötigen kubectl
.
Antwort1
Es gibt vielleicht bessere Möglichkeiten, das zu tun, aber eine schnelle Möglichkeit ist die Verwendung derSetEnv
Direktive von der Befehlszeile von sshd
:
export FOO=bar
sshd ... -o "SetEnv=FOO=$FOO" ...
export FOO=foo BAR='baz quux'
sshd ... -o "SetEnv=FOO=$FOO BAR=\"$BAR\"" ...
Die SetEnv
Direktive wird seit OpenSSH 7.8 unterstützt (siehe sshd -V
). Wie bei allen -o key=val
Optionen gilt nur dieErsteverwendet wird.
Bei älteren Versionen können Sie eine automatisch generierte Datei aus den Benutzerdateien ~/.ssh/rc
(PermitUserRC
) oder aus den Initialisierungsdateien der Login-Shell: Beim Start über SSH werden Bash-Quellen ~/.bashrc
(und davor, bei Debian-ähnlichen Distributionen, /etc/bash.bashrc
) auch im nicht-interaktiven Modus[1].
Verwende nicht PermitUserEnvironment
weil dies einem Benutzer ermöglicht, seine Anmelde-Shell und alle ForceCommand
Vias zu umgehen LD_PRELOAD
.
Testbeispiel mit sshd
Ausführung als normaler Benutzer:
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\""
Verbinde dich damit
$ ssh -p 2222 localhost 'echo "$FOO" "$BAR"'
foo baz quux
Sie können
alias ssh0='ssh -o UserKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no -o LogLevel=ERROR'
ssh0 ...
wenn Sie verhindern möchten, dass SSH nach dem Wegwerfschlüssel fragt und diesen zur Datei der bekannten Hosts hinzufügt.
[1]Bash ermittelt, ob es von SSH gestartet wird, indem es die SSH_CLIENT
und SHLVL
Umgebungsvariablen überprüft. Dies ist eine weitere Möglichkeit, die PermitUserEnvironment
„nützlich“ sein kann – um die zu umgehen, /etc/bash.bashrc
die in Debian-ähnlichen Distributionen vor allem anderen als Quelle verwendet wird:
$ bash -xc ''
<nothing>
$ SHLVL= SSH_CLIENT=foo bash -xc ''
+ case $- in
+ return
<stuff from /etb/bash.bashrc and ~/.bashrc>