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 ?
Réponses
Trop de publicités?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 ( '
).
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
.
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
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
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é.
- Réponses précédentes
- Plus de réponses