Variables de entorno cuando se ejecuta con 'sudo'

48

Como ejemplo a mi pregunta, mi ~/.bashrcarchivo contiene estas líneas:

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

para que Numpy (Python) pueda encontrar las bibliotecas que necesita ejecutar, ya que está construido con compiladores MKL e Intel. Este flujo de trabajo no es el mejor, pero esa es otra historia.

Mi pregunta es ¿cómo puedo pasar variables arbitrarias (como las que están en ~/.bashrc) cuando ejecuto un programa con 'sudo' (pero no root)?

Actualmente, si ejecuto:

sudo python -c "import numpy"

Me sale un error:

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

Algunas sugerencias como sudo -io sudo -Eno cambian nada aquí.


Editar:

No puedo responder a mi pregunta (no hay suficientes puntos: D) pero comentaré aquí, con la esperanza de que haya otros novatos de Linux que se pregunten acerca de las sudotrampas.

[¡Solo temporalmente!] Esto funciona para mí ( ~/.bashrc):

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

Respuestas:

57

Las variables de entorno pueden pasarse simplemente después sudoen forma ENV = VALOR y serán aceptadas por el comando seguido. No sé si existen restricciones para este uso, por lo que mi problema de ejemplo se puede resolver con:

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
fuente
Todavía hoy esto funcionó para mí, en mi Raspbian Jessy para mi RPi 3 ... después de casi una semana rompiendo mi cabeza, ¿por qué mi script no se ejecutó en el inicio? ¡Muchas gracias!
DarkCygnus
21

La -Eopción que mencionas parece funcionar bien:

enzotib@host:~$ export DUMMY=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=dummy
enzotib
fuente
Lo siento, pero no entiendo tu respuesta. ¿Puedes dar un ejemplo del escenario que publiqué anteriormente? es decir, para ser capaz de ejecutar sudo python -c "import numpy"con LD_LIBRARY_PATHy LD_PRELOADdefinido como escrito arriba?
zetah
2
@zetah: ok, estoy equivocado, porque funciona para variables genéricas, pero no para variables de control de enlace dinámico, como se indica en la sección SECURITY NOTESde sudola página del manual.
enzotib
Es más simple que eso (como en la respuesta provista), aunque man sudono lo aclara, y cuando el usuario intenta seguir las referencias apuntadas allí, es muy fácil desanimarse por todas las ramas necesarias para poder descifrarlas. sentido.
zetah
14

Puede usar la -Eopción sudo para preservar el entorno actual (si tiene derechos para hacerlo)

$ 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
fuente
8

Debe editar su sudoersby sudo visudoya que posiblemente haya habilitado el complemento de política de seguridad que anula su opción PATHby secure_path. Agregue la ruta a la lista y también puede usarla env_keep, por ejemplo:

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

Para verificar si PATHse reemplaza su, ejecute el siguiente comando:

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

Ver también: ¿Por qué las variables PATH son diferentes cuando se ejecutan a través de sudo y su? en Unix SE

kenorb
fuente
+1, pero env_keepno funciona en PATH (en el sentido que sudotodavía se usa secure_pathcuando se busca el comando)
Zanna
0

Esto funciona para mí ( ~/.bashrc):

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

Fuente: según la edición de OP

kenorb
fuente
1
esto funciona, pero es una mala idea porque hace que correr sea sudomenos seguro
Zanna