2010-07-13 16:59:57 +0000 2010-07-13 16:59:57 +0000
95
95

Lors du ssh'ing, comment puis-je définir une variable d'environnement sur le serveur qui change de session en session ?

Lorsque je ssh dans un serveur, comment puis-je faire passer une variable d'environnement du client au serveur ? Cette variable d'environnement change entre les différentes invocations de ssh, donc je ne veux pas écraser $HOME/.ssh2/environment à chaque fois que je fais un appel ssh. Comment puis-je faire cela ?

Réponses (8)

116
116
116
2010-07-13 19:25:13 +0000

Bien sûr, vous pouvez définir la variable d'environnement à l'intérieur de la commande, mais vous devrez faire attention aux citations : rappelez-vous que votre shell va analyser votre ligne de commande locale, et que le shell distant aura ensuite un essai sur la chaîne qu'il 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é en /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_* jusqu'à, et vous pouvez faire ce qui suit :

ssh -o SendEnv=LC\_MYVAR server.example.com 'MYVAR=$LC\_MYVAR; unset LC\_MYVAR; export MYVAR; mycommand'

Si même LC_* n'est pas une option, vous pouvez passer des informations dans la variable d'environnement TERM, qui est toujours copiée (il peut cependant y avoir une limite de longueur). Vous devrez quand même 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 distant.

env TERM="extra information:$TERM" ssh -t server.example.com 'MYVAR=${TERM%:\*}; TERM=${TERM##\*:}; export MYVAR; mycommand'

Une autre possibilité est de définir la variable directement dans la commande :

ssh -t server.example.com 'export MYVAR="extra information"; mycommand'

Ainsi, si vous passez une variable locale :

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

Cependant, attention aux problèmes de citation : la valeur de la variable sera interpolée directement dans le snippet shell exécuté du côté distant. Le dernier exemple ci-dessus suppose que $LOCALVAR ne contient aucune apostrophe (').

12
12
12
2012-02-03 17:09:54 +0000

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.

Depuis la page de manuel de 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

6
6
6
2010-07-13 17:52:27 +0000

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

ssh remote.host my_command

Vous pouvez le faire :

ssh remote.host env ENV_VAR=$ENV_VAR my_command
4
4
4
2019-06-12 10:45:04 +0000

Sur votre client local, dans votre ~/.ssh/config vous pouvez ajouter SetEnv, par exemple

Host myhost
  SetEnv FOO=bar

Note : Cochez man ssh_config.

Puis sur le serveur, assurez-vous de permettre au client de passer certaines variables d'environnement dans votre fichier de configuration /etc/ssh/sshd_config :

AcceptEnv LANG LC_* FOO BAR*

Note : Vérifiez man sshd_config.

3
3
3
2018-05-14 14:36:55 +0000

La réponse d’@emptyset (qui n'a pas fonctionné pour moi) m'a conduit à 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> sortait immédiatement, et la connexion SSH était fermée (m'empêchant d'accéder au serveur), alors que /usr/bin/env ... $SHELL fera tourner votre shell par défaut avec un environnement modifié.

1
1
1
2010-07-13 17:15:31 +0000

Vous pouvez essayer d'invoquer une commande personnalisée, en supposant que vous avez une configuration de connexion ssh sans mot de passe. Sur le serveur, modifiez votre entrée ~/.ssh/authorized_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
1
1
2015-08-28 16:55:01 +0000

Je faisais une construction personnalisée d'OpenSSH pour un appareil avec un cramfs dans le répertoire home et /etc (Cram FS est en lecture seule) donc ~/.ssh/environment ne fonctionnerait pas sans reconstruire l'ensemble du FS et c'était des appareils déployés sur le terrain (systèmes embarqués d'où l'utilisation de CRAMFS). Vous pouvez spécifier dans le sshd_config l'emplacement du fichier authroized_keys mais, pour une raison quelconque, l'environment= ne fonctionne que pour les variables d'environnement dans les ~/.ssh/authroized_keys. La modification du fichier /etc/profile n'était pas une option et j'ai dû charger ssh dans un répertoire non standard. Dans session.c après le child_set_env(… “MAIL”…) ajoutez juste les variables d'environnement dont vous avez besoin(C'est un hack que je connais…) mais au cas où quelqu'un aurait besoin de variables d'environnement codées en dur pour une session, si vous compilez à partir des sources, vous pouvez le faire. TGI-FLOSS

0
0
0
2019-04-11 17:12:11 +0000

une seule commande simple :

ssh -t your_host_or_ip 'export some_var_name=whatever_you_want; bash'
```.