62 votes

Variables d'environnement lors de l'exécution avec 'sudo

En guise d'exemple à ma question, mon ~/.bashrc contient ces lignes :

export LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH
export LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so

pour que Numpy (Python) puisse trouver les bibliothèques dont il a besoin pour fonctionner, car il est construit avec les compilateurs MKL et Intel. Ce flux de travail n'est pas le meilleur, mais c'est une autre histoire.

Ma question est la suivante comment puis-je faire passer des variables arbitraires (comme celles de la rubrique ~/.bashrc ) lorsque je lance le programme avec 'sudo' (mais pas root) ?

Actuellement, si je cours :

sudo python -c "import numpy"

Je reçois une erreur :

ImportError: libimf.so: cannot open shared object file: No such file or directory*

Quelques suggestions comme sudo -i o sudo -E ne change rien ici.


Edita:

Je ne peux pas répondre à ma question (pas assez de points :D ) mais je vais la commenter ici, en espérant que d'autres débutants sous Linux se posent la question suivante sudo pièges.

[Seulement temporairement !] Cela fonctionne pour moi ( ~/.bashrc ):

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'

63voto

Scott Noyes Points 1596

Les variables d'environnement peuvent être simplement passées après sudo sous la forme ENV=VALUE et ils seront acceptés par la commande suivante. Je ne sais pas s'il y a des restrictions à cette utilisation, donc mon problème d'exemple peut être résolu avec :

sudo LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so python -c "import numpy"

28voto

enzotib Points 86709

En -E L'option que vous mentionnez semble fonctionner parfaitement :

enzotib@host:~$ export DUMMY=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=dummy

18voto

Eugen Konkov Points 636

Vous pouvez utiliser -E option sudo pour préserver l'environnement actuel (si vous avez les droits pour le faire)

$ 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.

12voto

kenorb Points 8840

Vous devez modifier votre sudoers por sudo visudo car il est possible que vous ayez activé un plugin de politique de sécurité qui remplace votre PATH por secure_path option. Ajoutez donc le chemin à la liste et vous pouvez aussi utiliser env_keep à la place, par exemple :

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

Pour vérifier si votre PATH est remplacée, exécutez la commande suivante :

$ sudo sudo -V | grep PATH
Value to override user's $PATH with: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Voir aussi : Pourquoi les variables PATH sont-elles différentes lors d'une exécution via sudo et su ? chez Unix SE

1voto

kenorb Points 8840

Cela fonctionne pour moi ( ~/.bashrc ):

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'

Source : Selon OP edit

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