web-dev-qa-db-fra.com

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

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

EDIT: le but 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 de multiples instances ssh peuvent être en vol en même temps est que, lorsque je configure mon environnement, j'ouvre un tas d'instances ssh différentes à différentes machines.

38
Ross Rogers

Le fichier ~/.ssh/environment peut être utilisé pour définir les variables que vous souhaitez voir disponibles pour les commandes à distance. Vous devrez activer PermitUserEnvironment dans la configuration de sshd.

Les variables définies de cette manière sont exportées vers des processus enfants. Vous pouvez donc:

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.

15
John T

L'option SendEnv est votre homme.

~/.ssh/config: (localement)

SendEnv MYVAR

/etc/ssh/sshd_config: (du côté distant)

AcceptEnv MYVAR

Désormais, 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 éventuellement des valeurs différentes.

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

50
user15617

Il y a aussi un horrible, horrible hack.

Si votre script utilise la variable du côté distant (c’est-à-dire que vous pouvez la nommer comme vous le souhaitez), vous pouvez abuser des variables de paramètres régionaux. Toute variable de la forme LC_ * sera transmise telle quelle, sans aucune configuration.

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

Fondamentalement, si LC_BOUNCE_HOSTS est défini, il est divisé en espaces et arrache 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 et la commande est donc exécutée. J'ai également un mode de débogage (ce qui est excellent lors de problèmes réseau), défini par LC_BOUNCE_DEBUG. Puisque ssh passe tout cela magiquement pour moi, je ne dois rien faire d’autre que reconnaître la fin de la liste des hôtes (ce que je fais avec une option -).

Je me sens sale à chaque fois que j'utilise ceci, mais cela fonctionne partout où je l'ai essayé.

28
Jayson

Vous pouvez transmettre 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 ce qui suit semble fonctionner:

ssh machine "setenv VAR <value>; printenv"
27
Waltor
bla="MyEnvSelection=dcop"
ssh user@Host "export $bla && ./runProg"

A 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"
1
Zeh