Wie kann ich Umgebungsvariablen aus der SSHD-Umgebung an neue SSH-Sitzungen übergeben?

Wie kann ich Umgebungsvariablen aus der SSHD-Umgebung an neue SSH-Sitzungen übergeben?

Wie kann ich Umgebungsvariablen aus sshdder Umgebung an neue SSH-Sitzungen übergeben?

Ich verwende sshdKubernetes-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 derSetEnvDirektive 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 SetEnvDirektive wird seit OpenSSH 7.8 unterstützt (siehe sshd -V). Wie bei allen -o key=valOptionen 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 PermitUserEnvironmentweil dies einem Benutzer ermöglicht, seine Anmelde-Shell und alle ForceCommandVias zu umgehen LD_PRELOAD.


Testbeispiel mit sshdAusfü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_CLIENTund SHLVLUmgebungsvariablen überprüft. Dies ist eine weitere Möglichkeit, die PermitUserEnvironment„nützlich“ sein kann – um die zu umgehen, /etc/bash.bashrcdie 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>

verwandte Informationen