148 votes

Lors d'une connexion ssh, comment puis-je définir une variable d'environnement sur le serveur qui change d'une session à l'autre ?

Quand 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 et je ne veux pas écraser les données. $HOME/.ssh2/environment à chaque fois que je fais un appel ssh. Comment puis-je faire cela ?

161voto

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, puis que le Shell distant va utiliser 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 la méthode suivante SendEnv option :

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

Cela nécessite toutefois le soutien 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_* à travers, 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 transmettre des informations dans le champ TERM qui est toujours copiée (il peut toutefois y avoir une limite de longueur). Vous devrez tout de même vous assurer que le Shell distant ne limite pas la variable d'environnement TERM variable pour désigner un type de terminal connu. Passez le -t à ssh si vous ne démarrez pas un Shell interactif à distance.

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

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

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

Ainsi, si l'on passe 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 pas de guillemets simples ( ' ).

31voto

kenorb Points 22006

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

Host myhost
  SetEnv FOO=bar

Note : Vérifiez man ssh_config .

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

AcceptEnv LANG LC_* FOO BAR*

Note : Vérifiez man sshd_config .

21voto

raven Points 9396

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

Depuis 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 se trouve généralement à /etc/ssh/sshd_config

6voto

pioto Points 544

Donc, sur votre client, vous avez une certaine variable d'environnement, et vous voulez qu'elle soit disponible pour la commande à distance ? Je ne pense pas qu'il y ait un moyen pour que ssh la transmette 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

5voto

madprog Points 41

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

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

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

export VARIABLE=<something> se terminait immédiatement, et la connexion SSH était fermée (me bloquant hors du serveur), alors que /usr/bin/env ... $SHELL lancera votre Shell par défaut avec un environnement modifié.

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