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.
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.
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.
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é.
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"
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"