web-dev-qa-db-fra.com

Lorsque vous vous trouvez, comment définir une variable d'environnement sur le serveur qui change de session en session?

Lorsque je ssh sur un serveur, comment puis-je transmettre une variable d'environnement du client au serveur? Cette variable d'environnement change entre les différents appels de ssh, je ne veux donc pas écraser $HOME/.ssh2/environment à chaque fois que je passe un appel ssh. Comment puis-je faire ceci?

85
Ross Rogers

Bien sûr, vous pouvez définir la variable d'environnement à l'intérieur de la commande, mais vous devrez faire attention à la citation: rappelez-vous que votre shell va analyser votre ligne de commande locale, et que le shell distant essaiera la chaîne. reçoit.

Si vous voulez qu'une variable obtienne la même valeur sur le serveur que sur le client, essayez l'option SendEnv:

 ssh -o SendEnv = MYVAR server.example.com mycommand 

Cela nécessite cependant le support du serveur. Avec OpenSSH, le nom de la variable doit être autorisé dans /etc/sshd_config.

Si le serveur n'autorise que certains noms de variables spécifiques, vous pouvez contourner ce problème. Par exemple, une configuration commune autorise LC_* à travers, et vous pouvez effectuer les opérations suivantes:

 ssh -o SendEnv = LC_MYVAR server.example.com 'MYVAR = $ LC_MYVAR; unset LC_MYVAR; exporter MYVAR; ma commande '

Si même LC_* n'est pas une option, vous pouvez transmettre des informations dans la variable d'environnement TERM, qui est toujours copiée (il peut toutefois exister une limite de longueur). Vous devrez toujours vous assurer que le Shell distant ne restreint pas la variable TERM pour désigner un type de terminal connu. Passez l'option -t à ssh si vous ne démarrez pas un shell interactif à distance.

 env TERM = "informations supplémentaires: $ TERM" ssh -t server.example.com 'MYVAR = $ {TERM%: *}; TERM = $ {TERM ## *:}; exporter MYVAR; ma commande '

Une autre possibilité consiste à définir la variable directement dans la commande:

 ssh -t server.example.com 'export MYVAR = "informations supplémentaires"; ma commande '

Ainsi, en passant une variable locale:

 ssh -t server.example.com 'export MYVAR =' "'$ LOCALVAR'" '; ma commande '

Cependant, méfiez-vous des problèmes de citation: la valeur de la variable sera interpolée directement dans l'extrait de shell exécuté du côté distant. Le dernier exemple ci-dessus suppose que $LOCALVAR ne contient pas de guillemets simples (').

103
Gilles

Si vous pouvez administrer l'hôte cible, vous pouvez configurer sshd pour permettre la transmission de vos variables d'environnement locales à l'hôte cible.

A partir de la page de manuel sshd_config:

 PermitUserEnvironment
     Specifies whether ~/.ssh/environment and environment= options in
     ~/.ssh/authorized_keys are processed by sshd.  The default is
     "no".  Enabling environment processing may enable users to bypass
     access restrictions in some configurations using mechanisms such
     as LD_PRELOAD.

la configuration de sshd vit généralement à /etc/ssh/sshd_config

12
Duncan Beevers

Donc, sur votre client, vous avez une variable d’environnement et vous voulez que celle-ci soit disponible pour la commande à distance? Je ne pense pas qu'il y ait moyen de faire passer ssh magiquement, mais vous pouvez probablement faire quelque chose comme ça. Au lieu d'utiliser, dites:

ssh remote.Host my_command

Tu peux le faire:

ssh remote.Host env ENV_VAR=$ENV_VAR my_command
6
pioto

La réponse de @ emptyset (qui n'a pas fonctionné pour moi) m'a amenée à cette réponse:

Vous pouvez ajouter cette commande à votre fichier ~/.ssh/authorized_keys:

command="/usr/bin/env VARIABLE=<something> $Shell" ssh-rsa <key>

export VARIABLE=<something> a été immédiatement fermé et la connexion SSH a été fermée (me ferme du serveur), alors que /usr/bin/env ... $Shell exécutera votre shell par défaut avec un environnement modifié.

3
madprog

Vous pouvez essayer d'appeler une commande personnalisée, en supposant que vous avez la configuration de la connexion SSH sans mot de passe. Sur le serveur, éditez votre entrée ~/.ssh/registered_keys qui correspond à la clé de votre client:

command="export VARIABLE=<something>" ssh-rsa <key>

Regardez ce lien dans la section Commande forcée pour un peu plus de détails.

1
emptyset

Je construisais une version personnalisée d'OpenSSH pour un périphérique avec un fichier cramfs dans le répertoire personnel et/etc (Cram FS est en lecture seule). Ainsi, ~/.ssh/environment ne fonctionnerait pas sans une reconstruction complète. FS et il s’agissait de dispositifs déployés sur le terrain (systèmes intégrés d’où l’utilisation de CRAMFS). Vous pouvez spécifier dans sshd_config l'emplacement du fichier authroized_keys mais, pour une raison quelconque, environment = ne fonctionne que pour les variables d'environnement dans ~/.ssh/authroized_keys. Éditer le fichier/etc/profile n'était pas une option et je devais charger ssh dans un répertoire non standard. Dans session.c après le child_set_env (... "MAIL" ...), ajoutez simplement les variables d'environnement dont vous avez besoin (c'est un hack que je connais ...) en compilant à partir des sources, vous pouvez le faire. TGI-FLOSS

1
Will