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

48

Comme exemple à ma question, mon ~/.bashrcfichier 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

de sorte 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 de savoir comment puis-je passer des variables arbitraires (comme celles dans ~/.bashrc) lorsque je lance un 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*

Certaines suggestions comme sudo -iou sudo -Ene change 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 en Linux s’interrogent sur les sudopièges.

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

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'
Zetah
la source

Réponses:

57

Les variables d'environnement peuvent être simplement passées après sudosous la forme ENV = VALEUR et seront acceptées par la commande suivie. Je ne sais pas s'il existe des restrictions à cette utilisation. Mon exemple de problème peut donc ê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"
Zetah
la source
Encore aujourd'hui, cela a fonctionné pour moi, sur mon Raspbian Jessy pour mon RPi 3 ... après presque une semaine de crise, pourquoi mon script n'a- t- il pas été lancé au démarrage. Merci beaucoup!
DarkCygnus
21

L' -Eoption que vous mentionnez semble bien fonctionner:

enzotib@host:~$ export DUMMY=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=dummy
enzotib
la source
Désolé, mais je ne comprends pas votre réponse. Pouvez-vous donner un exemple sur le scénario que j'ai posté ci-dessus? c'est-à-dire pouvoir fonctionner sudo python -c "import numpy"avec LD_LIBRARY_PATHet LD_PRELOADdéfini comme écrit ci-dessus?
Zetah
2
@zetah: ok, je me trompe, car cela fonctionne pour les variables génériques, mais pas pour les variables de contrôle de liaison dymaniques, comme indiqué dans la section SECURITY NOTESde sudola page de manuel.
enzotib
C’est plus simple alors que (comme dans la réponse fournie), bien que cela man sudone soit pas clair, et lorsque l’utilisateur essaie de suivre les références pointées là, il est très facile de se décourager par toutes les branches qu’il faut suivre, pour pouvoir décrypter sens.
Zetah
14

Vous pouvez utiliser l' -Eoption 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.
Eugen Konkov
la source
8

Vous devez éditer votre sudoerspar sudo visudocar vous avez éventuellement un plug-in de politique de sécurité activé qui remplace votre option PATHpar secure_path. Donc, ajoutez le chemin à la liste et vous pouvez également utiliser à la env_keepplace, par exemple:

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

Pour vérifier si votre PATHest 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 avec sudo et su? chez Unix SE

Kenorb
la source
+1, mais env_keepne fonctionne pas sur PATH (dans le sens qu'il sudoutilise toujours secure_pathpour rechercher la commande)
Zanna
0

Cela fonctionne pour moi ( ~/.bashrc):

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

Source: Selon le montage OP

kenorb
la source
1
ça marche, mais c'est une mauvaise idée car cela rend la course sudomoins sûre
Zanna