Comment puis-je passer une variable d'environnement via une commande ssh?

Comment puis-je passer une valeur dans une commande ssh, de sorte que l'environnement démarré sur la machine hôte commence par une certaine variable d'environnement définie à mon choix?

EDIT: L'objectif est de transmettre le bureau kde actuel (de dcop kwin KWinInterface currentDesktop) au nouveau shell créé afin que je puisse renvoyer un emplacement nfs à mon instance JEdit sur le serveur d'origine qui est unique pour chaque bureau KDE. (Utilisation d'un mécanisme comme emacsserver / emacsclient )

La raison pour laquelle les multiples instances ssh peuvent être en vol à la fois est parce que lorsque je configure mon environnement, j'ouvre de nombreuses instances ssh différentes à différentes machines.

Le fichier ~/.ssh/environment peut être utilisé pour définir les variables souhaitées pour les commandes à distance. Vous devrez activer PermitUserEnvironment dans la configuration sshd.

Les variables définies de cette façon sont exportées vers des processus enfants, de sorte que vous pouvez:

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

Et myscript saura que Foo est Bar et Joe a 37 ans.

L'option SendEnv est votre gars.

~ / .ssh / config: (localement)

 SendEnv MYVAR 

/ Etc / ssh / sshd_config: (à distance)

 AcceptEnv MYVAR 

Maintenant, quelle que soit la valeur de $MYVAR localement, elle devient également disponible dans la session distante.
Si vous vous connectez plusieurs fois, chaque session aura sa propre copie de $MYVAR , avec des valeurs éventuellement différentes.

~/.ssh/environment est destiné à d'autres fins. Il agit comme $ENV fichier $ENV lors de l'exécution de commandes non-shell à distance.

Vous pouvez passer des valeurs avec une commande similaire à celle-ci:

 ssh username@machine VAR=value cmd cmdargs 

Vous pouvez tester avec:

 ssh machine VAR=hello env 

Sur tcsh, le suivant semble fonctionner:

 ssh machine "setenv VAR <value>; printenv" 

Il y a aussi un horrible et horrible hack.

Si votre script consomme la variable à distance (c.-à-d. Vous pouvez la nommer comme vous voulez), vous pouvez abuser des variables locales. Toute variable de la forme LC_ * sera transmise textuellement, sans aucune configuration requise.

Par exemple, nous avons une série de serveurs bastion chez l'un de mes clients. Je déteste avoir à me connecter à lui, juste pour me connecter à un autre serveur … et à un autre serveur … à chaque fois. J'ai un script qui se comporte comme SSH, sauf qu'il est intelligent.

Fondamentalement, si LC_BOUNCE_HOSTS est configuré, il le divise sur les espaces et enlève le premier hôte. Ensuite, il rebondit et exécute le même script. Sur le nœud de destination, cette liste est éventuellement vide, donc elle exécute la commande. J'ai également un mode de débogage (ce qui est génial lors des problèmes de réseau), qui est défini par LC_BOUNCE_DEBUG. Puisque ssh passe tout cela pour moi magiquement, je n'ai pas à faire autre chose que de reconnaître la fin de la liste d'hôte (ce que je fais avec une option -).

Je me sens sale à chaque fois que j'utilise ça, mais ça marche partout où je l'ai essayé.

 bla="MyEnvSelection=dcop" ssh user@host "export $bla && ./runProg" 

Sur bash j'ai testé avec:

 $ 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"