Variables d'environnement lorsqu'elles sont exécutées avec 'sudo'

39

Par exemple à ma question, mon fichier ~/.bashrc contient cette ligne:

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 qu’il doit exécuter, 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 comment passer des variables arbitraires (comme celles de ~/.bashrc ) lorsque je lance un programme avec "sudo" (mais pas root)?

Actuellement, si je cours:

sudo python -c "import numpy"

J'ai une erreur:

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

Quelques suggestions comme sudo -i ou sudo -E ne changent rien ici.

Modifier:

Je ne peux pas répondre à ma question (pas assez de points: D) mais je vais commenter ici, dans l’espoir que d’autres débutants de Linux s’interrogent sur sudo traps.

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

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'
    
posée zetah 20.08.2011 - 03:12
la source

5 réponses

47

Les variables d'environnement peuvent être simplement passées après sudo dans la forme ENV = VALUE et elles seront acceptées par la commande suivie. Je ne sais pas s'il existe des restrictions à cette utilisation, donc mon exemple de problème 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"
    
réponse donnée zetah 20.08.2011 - 11:22
la source
19

L'option -E que vous mentionnez semble fonctionner correctement:

[email protected]:~$ export DUMMY=dummy
[email protected]:~$ sudo -E sh -c 'echo $DUMMY'
dummy
[email protected]:~$ sudo -E env | grep DUMMY
DUMMY=dummy
    
réponse donnée enzotib 20.08.2011 - 07:37
la source
9

Vous pouvez utiliser l'option -E sudo pour préserver l'environnement actuel (si vous avez le droit de 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.
    
réponse donnée Eugen Konkov 14.09.2015 - 11:09
la source
7

Vous devez éditer votre sudoers en sudo visudo , car le plug-in de stratégie de sécurité est probablement activé, ce qui remplace votre option PATH by secure_path . Ajoutez donc le chemin à la liste et vous pouvez également utiliser env_keep , par exemple:

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

Pour vérifier si votre PATH est remplacé, 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 de l'exécution via sudo et su? sur Unix SE

    
réponse donnée kenorb 24.12.2015 - 19:28
la source
0

Cela fonctionne pour moi ( ~/.bashrc ):

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

Source: selon éditer OP

    
réponse donnée kenorb 13.04.2017 - 14:25
la source

Lire d'autres questions sur les étiquettes