51 votes

Comment faire en sorte que sudo préserve mes variables d'environnement ?

En utilisant sudo 1.7.4p4 sur Solaris 5.10 et sudo 1.6.7p5 sur RHEL4 u6, je ne vois pas comment préserver mes variables d'environnement, par exemple $PYTHONPATH. J'ai ajouté cette ligne à sudoers, mais cela ne fait aucune différence :

Defaults !env_reset

Est-ce que je fais quelque chose de mal, ou est-ce que l'installation sudo ne respecte tout simplement pas le drapeau env_reset ?

Éditer : Au moins sous Solaris, nous avons découvert que ce problème dépend du Shell ! Le Shell standard de la racine est Bourne, si nous lançons bash sous sudo ( sudo bash ) d'autre part, !env_preset préservera l'environnement (y compris PATH et LD_LIBRARY_PATH). Je dois dire que ce comportement est plutôt déroutant.

46voto

user39559 Points 1911

A utiliser avec précaution, il y a des problèmes de sécurité avec sudo et les variables.

En man sudoers J'ai découvert qu'il fallait utiliser

Defaults        env\_reset
Defaults        env\_keep += "PYTHONPATH OTHERVARIABLE YETANOTHER"

Dans Ubuntu, sudo préserve certaines variables. sudo -i consiste plutôt à se connecter en tant que root et à exécuter la commande. Les deux méthodes peuvent s'avérer peu pratiques, la première pour les sudo nano myfile laisse les fichiers appartenant à la racine à l'intérieur de votre domicile et le dernier pour les fichiers appartenant à la racine à l'intérieur de votre domicile. sudo -i nano myfile essaiera d'ouvrir /root/myfile.


Exécuter

sudo printenv PATH

et voir ce que cela donne. Voici ce qu'il donne

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

par exemple. Exécutez maintenant sudo visudo et ajouter la ligne

Defaults        secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

en remplacement de ce que vous avez trouvé juste avant. Ajoutez-y un nouveau chemin si nécessaire.

A propos des bibliothèques :

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

Les distributions Linux prennent beaucoup de soin avec PATH Il faut donc être prudent avant de jouer avec. Soyez particulièrement prudent lorsque vous ajoutez des chemins comme " . " ou /home/username il n'est pas sécurisé.

L'un des dangers de l'ajout de chemins d'accès est qu'il ouvre la possibilité que des fichiers situés sur ces chemins soient exécutés par root Il peut s'agir d'une faille dans la sécurité du système qui peut être exploitée par des logiciels malveillants. Il peut y avoir d'autres dangers. Assurez-vous de savoir ce que vous faites. Contournement sudo peuvent rendre votre Solaris aussi sûr que Windows XP.

9voto

Sunspawn Points 569

Le bricolage sudoers est à prendre avec précaution, comme d'autres l'ont dit.

Une approche plus simple pour les cas plus simples où il existe des variables d'environnement particulières que vous souhaitez préserver consiste à passer la variable d'environnement souhaitée directement à travers sudo (ce qui est illustré par la mention [VAR=value] dans l'aide sudo cmdline).

Voir ce petit exemple où je l'ai également démontré pour plus d'une variable.

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

Pour l'original PYTHONPATH dans la question, il suffit d'utiliser ce qui suit :

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

Il est pratique de créer un alias pour ce genre de choses. Par exemple :

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH python'

3voto

Mikel Points 8576

Votre Defaults !env_reset semble correct, en supposant que vous n'appelez pas également sudo avec l'option -E option.

Vous pouvez essayer de supprimer complètement cette entrée.

Avez-vous vérifié que vous éditez le bon fichier sudoers ? Je suppose qu'il pourrait s'agir de /etc/sudoers o /usr/local/etc/sudoers en fonction de la façon dont il a été installé. L'avez-vous modifié en utilisant visudo ?

Comment utilisez-vous sudo ? sudo python , sudo su , sudo su - , sudo -s ou quelque chose d'autre ? Seulement sudo python y sudo su préserverait votre environnement.

Qu'est-ce que env | grep PYTHONPATH dire ? Si rien ne se passe, assurez-vous que PYTHONPATH est exporté en lançant export PYTHONPATH et réessayer.

Qu'est-ce que sudo env | grep PYTHONPATH dire ? S'il affiche la valeur attendue, c'est que quelque chose d'autre écrase la valeur de PYTHONPATH. Peut-être le .bashrc ou le .bash_profile de root ou les fichiers de configuration du système.

0voto

k_o_ Points 111

Qu'en est-il de

sudo -E ...

En man sudo :

-E, --preserve-env
            Indicates to the security policy that the user wishes to >preserve their existing environment variables.  The security policy may return an >error if
            the user does not have permission to preserve the environment.

0voto

Andrei Pokrovsky Points 161
sudo su
source ~/.bashrc
cd /home/my_nosudo_user

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