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

43

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.

Ross Rogers
la source

Réponses:

19

Le ~/.ssh/environmentfichier peut être utilisé pour définir les variables que vous souhaitez voir disponibles pour les commandes à distance. Vous devrez activer PermitUserEnvironmentdans 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.

John T
la source
3
la variable doit potentiellement changer chaque appel ssh
Ross Rogers
1
Peut-être serait-il préférable de décrire ce que vous essayez de faire et pourquoi. Il pourrait y avoir d'autres solutions. Le fichier d'environnement devrait être généré dynamiquement à chaque appel ssh, ce qui n'est pas impossible.
EmmEff
Qu'est-ce qui va changer? Les valeurs de ces variables ou même leurs noms?
InnaM
2
Cette réponse ne semble pas vraiment répondre à la question.
intuited
1
Cela se cassera si deux processus essayent de faire cela avec différents ensembles de valeurs simultanément
nafg
55

L' SendEnvoption est ton gars.

~ / .ssh / config: (localement)

SendEnv MYVAR

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

AcceptEnv MYVAR

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

~/.ssh/environmentest destiné à d'autres fins. Cela agit en quelque sorte comme un $ENVfichier lors de l’exécution à distance de commandes autres que le shell .


la source
6
peut également être passé (plus utilement) via la ligne de commande en tant que ssh myserver -o SendEnv="MYVAR", afin que vous puissiez le rendre dynamique dans les scripts.
Mike Campbell
31

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"
Waltor
la source
On dirait que cela fonctionne bien pour les environnements bash. Dommage que je sois dans un environnement d'entreprise tcsh.
Ross Rogers
2
Comment puis-je utiliser la session de manière interactive?
LuckyDonald
1
Notez que le premier exemple ne fonctionne que pour la première commande si vous chaînez des commandes ensemble (avec &&). L'utilisation de bash export VAR=value;au lieu de setenv dans la troisième forme fonctionne dans ce cas.
contrebis le
2
C'est ce que j'ai fini par faire! Où que vous alliez, emportez votre environnement avec vous. Votre peut le faire comme ça: ssh user@host "$(<env_to_source.sh) command ..." . Dans env à la source, j'ai export var=value ; sur des lignes séparées (rappelez-vous le point-virgule).
Tomasz Gandor
@TomaszGandor: des années plus tard, toujours parfait - me permet même de transmettre des trucs complexes comme PROMPT_COMMAND sans avoir à craindre de fuir :-) 1000 merci.
Pilule rouge le
29

Il y a aussi un horrible, horrible hack.

Si votre script utilise la variable du côté distant (vous pouvez le 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 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 ceci, mais cela fonctionne partout où je l'ai essayé.

Jayson
la source
2
Pourquoi voudriez-vous utiliser quelque chose comme ça au lieu de l' ProxyCommandoption intégrée d'OpenSSH ? Modifiez votre ~/.ssh/configet ajoutez un bloc comme Host *.example.com: ProxyCommand -ssh -W %h:%p bastionhostet laissez-le canaliser vos connexions pour vous.
Kirk Strauser
1
Pour les tunnels, ce n'est pas si grave. Pour env vars, deux raisons: Premièrement, PermitUserEnvironment nécessite un accès administrateur pour pouvoir être configuré directement sur le serveur. Les passer par la ligne de commande est également très difficile à maîtriser. Deux bastions multiples doivent être traversés, ce qui rend le processus un peu plus complexe, en particulier lorsque l’hôte source ne sait pas quel chemin emprunter pour atteindre un hôte de destination donné. Il est plus facile de dire: "bounce-ssh bast1 bast2 nodeX - rm -rf /" que de conserver les routes pour une population en évolution d'hôtes dans une série de fichiers ssh-config.
Jayson
Bonne prise !! Si merveilleux et un peu sale !!
Zw963
2
C'est horrible. Bravo. 👏
Pi Delport
1
C'est horriblement génial, merci! Je l'ai utilisé pour un autre hack terriblement sympa ! :)
lombrique
1
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"
Zeh
la source