Techno Geek‎ > ‎

[LINUX] Les secrets des variables d'environnement avec ssh

publié le 30 nov. 2011 à 03:41 par Florian GRISONI   [ mis à jour : 15 déc. 2011 à 02:36 ]
Le but est de comprendre enfin pourquoi un script lancé par ssh ou suite à un ssh ne fait pas toujours ce que l'on veut. L'utilisation de ssh est traitre car les problèmes peuvent se manifester indirectement, par exemple changement de la variable LANG entrainera des problème d'accent ou de , dans une IHM java. On rencontrera plus souvent des problèmes de PATH.

Nous allons donc percer certains mystères afin d'en finir avec SSH et les effets de bord (enfin dans la mesure du possible)

La transmission de variables d'environnement par SSH


La configuration se fait dans le fichier: /etc/ssh/ssh_config


PermitUserEnvironment


Spécifier les variables et les valeurs envoyées par SSH
Cela s’effectue via la variable PermitUserEnvironment dans le fichier de configuration /etc/ssh/sshd_config
Page man 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.

Donc une des premières choses à savoir est la valeur de cette variable
PermitUserEnvironment yes

Yes : on aura potentiellement des valeurs différentes pour les variables d'environnement local et remote.

Les variables peuvent être définit à plusieurs endroits:
dans le fichier $HOME/.ssh/environment ou ~/.ssh/authorized_keys

Exemple :

cat $HOME/.ssh/environment

LANG=fr_FR

La variable LANG sera envoyée par ssh avec la valeur définit dans le fichier $HOME/.ssh/environment  

SendEnv

Spécifier les variables de l'environnement local qui seront envoyé par SSH 

Dans le fichier /etc/ssh/ssh_config la variable SendEnv permet de definir les variables.

SendEnv LANG

La variable LANG sera envoyée par ssh avec la valeur définit par l'environnement de l'utilisateur effectuant le SSH

Bien déclarer les variables d’environnement


Une autre chose pouvant entrainer des différences est le fichier dans lequel sont définit les variables d'environnement dans l'environnement remote.

Nous allons voir ici lorsque le shell définit est bash

[monuser@machienremote~]$ cat /etc/passwd | grep monuser
******* :/bin/bash


Il existe 2 fichiers de configuration en fonction que nous ayons appelé le shell en mode interactif ou non : ~/.profile et ~/.bashrc.
~/.profile – lu par ssh par le shell interactif
~/.bashrc – lu par ssh par le shell non-interactif

Pour éviter ce problème il existe une solution

Rajouter dans le fichier ~/.profile
. ~/.bashrc
Attention faire l'inverse à savoir dans le bashrc sourcer le .profile peux entrainer des problème notamment si celui si effectue des echo: scp peut ne plus fonctionner..

Debug ou comment voir les variables qui sont passées


Pour cela utiliser ssh en mode debug qui indiquera les fichiers de configuration utilisée et les variables envoyées. Si cela ne donne rien voir la définition des variable d'environnements : attention au mode interactif ou non interactif qui ne lisent pas les même fichiers.

[monuser@machine1~]$ ssh -v machine2
OpenSSH_4.3p2, OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to machine2 [127.0.0.2] port 22.
debug1: Connection established.
[...]
monuser@machine2's password:******

debug1: Authentication succeeded (password).
debug1: channel 0: new [client-session]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = fr_FR
Last login: Tue Nov 26 15:00:23 2011 from 127.0.0.1

Dans ce cas nous voyons que la variable LANG est passée à la machine2.




Comments