2010-07-13 16:59:57 +0000 2010-07-13 16:59:57 +0000
95
95

Wie kann ich beim ssh'ing eine Umgebungsvariable auf dem Server setzen, die sich von Sitzung zu Sitzung ändert?

Wie kann ich beim ssh in einen Server eine Umgebungsvariable vom Client an den Server übergeben? Diese Umgebungsvariable ändert sich zwischen verschiedenen Aufrufen von ssh, so dass ich nicht bei jedem ssh-Aufruf $HOME/.ssh2/environment überschreiben möchte. Wie kann ich dies tun?

Antworten (8)

116
116
116
2010-07-13 19:25:13 +0000

Natürlich können Sie die Umgebungsvariable innerhalb des Befehls setzen, allerdings müssen Sie dann mit der Zitierweise vorsichtig sein: Denken Sie daran, dass Ihre Shell Ihre lokale Befehlszeile parsen wird und die entfernte Shell dann die empfangene Zeichenkette umsetzt.

Wenn Sie wollen, dass eine Variable auf dem Server denselben Wert erhält wie auf dem Client, versuchen Sie die Option SendEnv:

ssh -o SendEnv=MYVAR server.example.com mycommand

Dies erfordert allerdings die Unterstützung durch den Server. Bei OpenSSH muss der Variablenname in /etc/sshd_config autorisiert werden.

Wenn der Server nur bestimmte Variablennamen zulässt, können Sie das umgehen; zum Beispiel erlaubt eine übliche Einrichtung LC_* durch, und Sie können Folgendes tun:

ssh -o SendEnv=LC\_MYVAR server.example.com 'MYVAR=$LC\_MYVAR; unset LC\_MYVAR; export MYVAR; mycommand'

Wenn selbst LC_* keine Option ist, können Sie Informationen in der Umgebungsvariablen TERM übergeben, die immer kopiert wird (es kann jedoch eine Längenbegrenzung geben). Sie müssen trotzdem sicherstellen, dass die entfernte Shell die Variable TERM nicht darauf beschränkt, einen bekannten Terminaltyp zu bezeichnen. Übergeben Sie die Option -t an ssh, wenn Sie keine entfernte interaktive Shell starten.

env TERM="extra information:$TERM" ssh -t server.example.com 'MYVAR=${TERM%:\*}; TERM=${TERM##\*:}; export MYVAR; mycommand'

Eine andere Möglichkeit ist, die Variable direkt im Befehl zu definieren:

ssh -t server.example.com 'export MYVAR="extra information"; mycommand'

Wenn Sie also eine lokale Variable übergeben:

ssh -t server.example.com 'export MYVAR='"'$LOCALVAR'"'; mycommand'

Achten Sie jedoch auf Quoting-Probleme: Der Wert der Variablen wird direkt in den auf der entfernten Seite ausgeführten Shell-Schnipsel interpoliert. Das letzte Beispiel oben geht davon aus, dass $LOCALVAR keine einfachen Anführungszeichen enthält (').

12
12
12
2012-02-03 17:09:54 +0000

Wenn Sie den Zielhost administrieren können, können Sie sshd so konfigurieren, dass Ihre lokalen Umgebungsvariablen an den Zielhost weitergegeben werden können.

Aus der Manpage sshd_config:

PermitUserEnvironment
     Specifies whether ~/.ssh/environment and environment= options in
     ~/.ssh/authorized_keys are processed by sshd. The default is
     "no". Enabling environment processing may enable users to bypass
     access restrictions in some configurations using mechanisms such
     as LD_PRELOAD.

Die sshd-Konfiguration befindet sich normalerweise unter /etc/ssh/sshd_config

6
6
6
2010-07-13 17:52:27 +0000

Sie haben also auf Ihrem Client eine Umgebungsvariable und möchten, dass diese für den Remote-Befehl verfügbar ist? Ich glaube nicht, dass es eine Möglichkeit gibt, sie auf magische Weise an ssh weiterzugeben, aber Sie können wahrscheinlich so etwas tun. Anstelle von, sagen wir:

ssh remote.host my_command

können Sie dies tun:

ssh remote.host env ENV_VAR=$ENV_VAR my_command
4
4
4
2019-06-12 10:45:04 +0000

Auf Ihrem lokalen Client können Sie in Ihrer ~/.ssh/config hinzufügen, z. B.

Host myhost
  SetEnv FOO=bar

Hinweis: Prüfen Sie SetEnv.

Stellen Sie dann auf dem Server sicher, dass Sie dem Client erlauben, bestimmte Umgebungsvariablen in Ihrer man ssh_config-Konfigurationsdatei zu übergeben:

AcceptEnv LANG LC_* FOO BAR*

Hinweis: Prüfen Sie /etc/ssh/sshd_config.

3
3
3
2018-05-14 14:36:55 +0000

Die Antwort von @emptyset (die bei mir nicht funktionierte) führte mich zu dieser Antwort:

Sie können diesen Befehl zu Ihrer ~/.ssh/authorized_keys-Datei hinzufügen:

command="/usr/bin/env VARIABLE=<something> $SHELL" ssh-rsa <key>

export VARIABLE=<something> wurde sofort beendet, und die SSH-Verbindung wurde geschlossen (was mich vom Server aussperrte), während /usr/bin/env ... $SHELL Ihre Standard-Shell mit einer geänderten Umgebung ausführen wird.

1
1
1
2010-07-13 17:15:31 +0000

Sie könnten versuchen, einen benutzerdefinierten Befehl aufzurufen, vorausgesetzt, Sie haben eine passwortlose ssh-Anmeldung eingerichtet. Bearbeiten Sie auf dem Server den Eintrag ~/.ssh/authorized_keys, der dem Schlüssel Ihres Clients entspricht:

command="export VARIABLE=<something>" ssh-rsa <key>

Schauen Sie sich diesen Link im Abschnitt Forced Command an, um mehr Details zu erfahren.

1
1
1
2015-08-28 16:55:01 +0000

Ich habe ein benutzerdefiniertes Build von OpenSSH für ein Gerät mit einem Cramfs im Home-Verzeichnis und /etc erstellt (Cram FS ist schreibgeschützt), so dass ~/.ssh/environment nicht funktionieren würde, ohne das gesamte FS neu zu erstellen, und dies waren Geräte im Feldeinsatz (Embedded Systems, daher die Verwendung von CRAMFS). Sie können in der sshd_config den Speicherort der authroized_keys-Datei angeben, aber aus irgendeinem Grund funktioniert die environment= nur für Umgebungsvariablen in der ~/.ssh/authroized_keys. Das Editieren der /etc/profile war keine Option und ich musste ssh in einem nicht standardmäßigen Verzeichnis laden. In session.c nach dem child_set_env(… “MAIL”…) fügen Sie einfach die Umgebungsvariablen hinzu, die Sie benötigen (Das ist ein Hack, ich weiß…), aber nur für den Fall, dass jemand einige hart kodierte Umgebungsvariablen für eine Sitzung benötigt, wenn Sie aus dem Quellcode kompilieren, können Sie das tun. TGI-FLOSS

0
0
0
2019-04-11 17:12:11 +0000

nur ein einfacher Befehl :

ssh -t your_host_or_ip 'export some_var_name=whatever_you_want; bash'