64 votes

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

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

EDIT : Le but est de passer le bureau kde actuel ( à partir de dcop kwin KWinInterface currentDesktop ) à la nouvelle Shell créée afin que je puisse renvoyer un emplacement nfs à ma JEdit sur le serveur d'origine qui est unique pour chaque bureau KDE. ( En utilisant un mécanisme comme emacsserver / emacsclient )

La raison pour laquelle plusieurs instances ssh peuvent être en vol en même temps est que lorsque je configure mon environnement, j'ouvre un certain nombre d'instances ssh différentes vers différentes machines.

87voto

En SendEnv l'option est votre homme.

~/.ssh/config : (localement)

SendEnv MYVAR

/etc/ssh/sshd_config : (à l'extrémité distante)

AcceptEnv MYVAR

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

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

45voto

Waltor Points 451

Vous pouvez passer des valeurs avec une commande similaire à la suivante :

ssh username@machine VAR=value cmd cmdargs

Vous pouvez tester avec :

ssh machine VAR=hello env

Sous tcsh, ce qui suit semble fonctionner :

ssh machine "setenv VAR <value>; printenv"

35voto

Dalroth Points 2468

En ~/.ssh/environment peut être utilisé pour définir les variables que vous voulez rendre 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 les 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 est 37.

35voto

T P Points 1

Il y a aussi un horrible, horrible hack.

Si votre script consomme la variable à l'extrémité distante (c'est-à-dire que vous pouvez la nommer comme vous voulez), vous pouvez abuser des variables locales. Toute variable de la forme LC_* sera transmise mot pour mot, sans qu'il soit nécessaire de configurer quoi que ce soit.

Par exemple, nous avons une série de serveurs bastion chez un de mes clients. Je déteste devoir m'y 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 que c'est intelligent.

En gros, si LC_BOUNCE_HOSTS est défini, il divise sur les espaces et décolle le premier hôte. Puis il rebondit et exécute le même script. Sur le nœud de destination, cette liste est éventuellement vide, donc il exécute la commande. J'ai également un mode de débogage (qui est très utile lors de problèmes de réseau), qui est défini par LC_BOUNCE_DEBUG. Puisque ssh transmet tous ces éléments pour moi comme par magie, je n'ai rien d'autre à faire que de reconnaître la fin de la liste d'hôtes (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é.

2voto

Zeh Points 29
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"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X