web-dev-qa-db-fra.com

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

Comme exemple de ma question, mon fichier ~/.bashrc contient les lignes suivantes:

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 comment puis-je passer des variables arbitraires (comme celles de ~/.bashrc) quand 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 -i ou Sudo -E ne changent rien ici.


Edit:

Je ne peux pas répondre à ma question (pas assez de points: D) mais je commenterai ici, dans l’espoir que d’autres débutants en Linux s’interrogent sur les pièges Sudo.

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

alias Sudo='Sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'
48
zetah

Les variables d'environnement peuvent être simplement passées après Sudo sous la forme ENV = VALUE 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"
57
zetah

L'option -E que vous avez mentionnée 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
21
enzotib

Vous pouvez utiliser l'option -E Sudo pour préserver l'environnement actuel (si vous en avez le droit).

$ 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.
14
Eugen Konkov

Vous devez éditer votre sudoerspar Sudo visudo car vous pouvez éventuellement activer le plug-in de politique de sécurité qui remplace votre PATHpar secure_path. Donc, ajoutez le chemin à la liste et vous pouvez également utiliser env_keep à la place, 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? sous Unix SE

8
kenorb

Cela fonctionne pour moi (~/.bashrc):

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

Source: Selon OP edit

0
kenorb