Wie kann ich eine Umgebungsvariable über einen ssh-Befehl übergeben? [Duplikat]

42

Wie kann ich einen Wert an einen ssh-Befehl übergeben, sodass die auf dem Hostcomputer gestartete Umgebung mit einer bestimmten Umgebungsvariablen beginnt, die ich ausgewählt habe?

BEARBEITEN: Das Ziel besteht darin, den aktuellen KDE-Desktop (von dcop kwin KWinInterface currentDesktop) an die neu erstellte Shell weiterzugeben, damit ich einen nfs-Speicherort an meine JEdit- Instanz auf dem ursprünglichen Server zurückgeben kann, der für jeden KDE-Desktop eindeutig ist. (Mit einem Mechanismus wie emacsserver / emacsclient )

Der Grund, warum mehrere ssh-Instanzen gleichzeitig im Flug sind, ist, dass ich beim Einrichten meiner Umgebung eine Reihe verschiedener ssh-Instanzen für verschiedene Computer öffne.

Ross Rogers
quelle

Antworten:

17

Mit der ~/.ssh/environmentDatei können Sie die gewünschten Variablen für Remote-Befehle festlegen. Sie müssen PermitUserEnvironmentin der sshd-Konfiguration aktivieren.

Auf diese Weise festgelegte Variablen werden in untergeordnete Prozesse exportiert, sodass Sie:

echo "Foo=Bar" > sshenv
echo "Joe=37" >> sshenv
scp sshenv user@server:~/.ssh/environment
ssh user@server myscript

und myscript wird wissen, dass Foo Bar und Joe 37 ist.

John T
quelle
3
Die Variable muss möglicherweise jeden SSH-Aufruf ändern
Ross Rogers
1
Könnte besser zu beschreiben sein, was Sie versuchen, und warum. Es könnte andere Lösungen geben. Die Umgebungsdatei müsste bei jedem SSH-Aufruf dynamisch generiert werden, was nicht unmöglich ist.
EmmEff
Was wird sich ändern? Die Werte dieser Variablen oder sogar ihre Namen?
30.
verdammt. Ich habe diese Lösung ausprobiert, habe aber keinen Zugriff auf die sshd-Konfigurationsdatei und das Einfügen von vars in ~ / .ssh / environment oder ~ / .ssh2 / environment funktioniert nicht. Ich denke, ich werde einen Kludge verwenden, bei dem ich diese Variable auf einer NFS-Festplatte belasse und sie dann mit meiner ~ / .tcsh-Setup-Datei abspule.
Ross Rogers
2
Diese Antwort scheint die Frage nicht wirklich zu beantworten.
Intuited
55

Die SendEnvOption ist dein Typ.

~ / .ssh / config: (lokal)

SendEnv MYVAR

/ etc / ssh / sshd_config: (auf der entfernten Seite)

AcceptEnv MYVAR

Was auch immer der Wert von $MYVARlocal ist, es wird jetzt auch in der Remote-Sitzung verfügbar.
Wenn Sie sich mehrmals anmelden, verfügt jede Sitzung über eine eigene Kopie von $MYVARmit möglicherweise unterschiedlichen Werten.

~/.ssh/environmentist für andere Zwecke gedacht. Es fungiert als $ENVDatei, wenn Nicht-Shell- Befehle remote ausgeführt werden.


quelle
6
kann auch (nützlicher) über die Befehlszeile als übergeben werden ssh myserver -o SendEnv="MYVAR", damit Sie es in Skripten dynamisch machen können.
Mike Campbell
30

Sie können Werte mit einem Befehl übergeben, der dem folgenden ähnelt:

ssh username@machine VAR=value cmd cmdargs

Sie können testen mit:

ssh machine VAR=hello env

Unter tcsh scheint Folgendes zu funktionieren:

ssh machine "setenv VAR <value>; printenv"
Waltor
quelle
Sieht so aus, als würde das in bash Umgebungen gut funktionieren. Schade, dass ich mich in einer Unternehmensumgebung befinde.
Ross Rogers
2
Wie kann ich die Sitzung interaktiv nutzen?
Luckydonald
1
Beachten Sie, dass das erste Beispiel nur für den ersten Befehl funktioniert, wenn Sie Befehle miteinander verketten (mit &&). In export VAR=value;diesem Fall funktioniert die Verwendung von bash anstelle von setenv in der dritten Form.
Contrebis
2
Dies ist, was ich getan habe! Wohin Sie auch gehen, nehmen Sie Ihre Umgebung mit. Sie können es so machen: ssh user@host "$(<env_to_source.sh) command ..." . In env to source habe ich export var=value ; in separaten Zeilen (erinnere mich an das Semikolon).
Tomasz Gandor
@TomaszGandor: Jahre später, immer noch perfekt - erlaubt mir sogar komplexe Dinge wie PROMPT_COMMAND weiterzugeben, ohne mir Sorgen machen zu müssen :-) 1000 danke.
Rote Pille
29

Es gibt auch einen schrecklichen, schrecklichen Hack.

Wenn Ihr Skript die Variable auf der Remote-Seite verwendet (dh Sie können sie beliebig benennen), können Sie die Gebietsschemavariablen missbrauchen. Jede Variable der Form LC_ * wird wörtlich übergeben, ohne dass eine Konfiguration erforderlich ist.

Zum Beispiel haben wir eine Reihe von Bastionservern bei einem meiner Clients. Ich hasse es, mich damit verbinden zu müssen, nur um mich jedes Mal mit einem anderen Server zu verbinden ... und einem anderen Server. Ich habe ein Skript, das sich genau wie SSH verhält, nur dass es clever ist.

Grundsätzlich wird LC_BOUNCE_HOSTS auf Leerzeichen aufgeteilt und der erste Host abgeschält. Dann springt es durch und führt das gleiche Skript aus. Auf dem Zielknoten ist diese Liste möglicherweise leer, sodass der Befehl ausgeführt wird. Ich habe auch einen Debug-Modus (der bei Netzwerkproblemen großartig ist), der von LC_BOUNCE_DEBUG festgelegt wird. Da ssh all dies magisch für mich weitergibt, muss ich nichts anderes tun, als das Ende der Hostliste zu erkennen (was ich mit einer - Option tue).

Ich fühle mich jedes Mal schmutzig, wenn ich das benutze, aber es funktioniert überall, wo ich es ausprobiert habe.

Jayson
quelle
2
Warum sollten Sie so etwas anstelle der in OpenSSH integrierten ProxyCommandOption verwenden? Bearbeiten Sie Ihre ~/.ssh/configund fügen Sie einen Block hinzu wie Host *.example.com: ProxyCommand -ssh -W %h:%p bastionhostund lassen Sie Ihre Verbindungen für Sie tunneln.
Kirk Strauser
1
Für Tunnel ist es nicht so schlimm. Für env vars gibt es zwei Gründe: Zum einen erfordert PermitUserEnvironment Administratorzugriff, um auf dem Server zu konfigurieren, dass sie direkt übergeben werden. Es ist auch sehr schwierig, sie über die Befehlszeile zu übergeben, um die Flucht zu erreichen. Zwei, mehrere Bastionen müssen durchgebrochen werden, was das Ganze etwas komplexer macht - vor allem, wenn der Quellhost nicht weiß, welchen Pfad er zu einem bestimmten Zielhost nehmen soll. Es ist einfacher zu sagen: "bounce-ssh bast1 bast2 nodeX - rm -rf /", als die Routen für eine sich entwickelnde Population von Hosts in einer Reihe von ssh-config-Dateien zu verwalten.
Jayson
Guter Fang !! So wundervoll und ein bisschen dreckig !!
zw963
2
Das ist schrecklich. Bravo. 👏
Pi Delport
1
Das ist schrecklich toll, danke! Ich habe es für einen weiteren schrecklich schönen Hack benutzt ! :)
lumbric
1
bla="MyEnvSelection=dcop"
ssh user@host "export $bla && ./runProg"

Auf Bash habe ich getestet mit:

$ echo '#!/bin/sh' > readEnv.sh
$ echo 'echo "MyEnv: "$MyEnvFromSSH' >> readEnv.sh

$ scp readEnv.sh user@host:~/
$ bla="MyEnvFromSSH=qwert"
$ ssh user@host "export $bla && ./readEnv.sh"
Zeh
quelle