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

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"


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

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.

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


+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


1
esto funciona, pero es una mala idea porque hace que correr sea sudomenos seguro
Zanna
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.