Variáveis de ambiente quando executado com 'sudo'

38

Como exemplo da minha pergunta, meu arquivo ~/.bashrc contém estas linhas:

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 o Numpy (Python) encontre bibliotecas que ele precisa executar, já que ele é compilado com compiladores MKL e Intel. Este fluxo de trabalho não é o melhor, mas isso é outra história.

Minha pergunta é como posso passar variáveis arbitrárias (como aquelas em ~/.bashrc ) quando executo um programa com 'sudo' (mas não com root)?

Atualmente, se eu executar:

sudo python -c "import numpy"

Eu recebo um erro:

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

Algumas sugestões como sudo -i ou sudo -E não alteram nada aqui.

Editar:

Eu não posso responder a minha pergunta (não há pontos suficientes: D), mas vou comentar aqui, na esperança de que existam outros novatos em Linux perguntando sobre sudo traps.

[Apenas temporariamente!] Isso funciona para mim ( ~/.bashrc ):

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'
    
por zetah 20.08.2011 / 03:12

5 respostas

45

As variáveis de ambiente podem ser simplesmente passadas após sudo no formulário ENV = VALUE e elas serão aceitas pelo comando seguido. Não sei se há restrições para esse uso, então meu problema de exemplo pode ser resolvido com:

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"
    
por zetah 20.08.2011 / 11:22
14

A opção -E que você mencionou parece funcionar bem:

enzotib@host:~$ export DUMMY=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=dummy
    
por enzotib 20.08.2011 / 07:37
8

Você pode usar a opção -E sudo para preservar o ambiente atual (se você tiver direitos para fazer isso)

$ 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.
    
por Eugen Konkov 14.09.2015 / 11:09
6

Você precisa editar o seu sudoers by sudo visudo , já que o plug-in da política de segurança está ativado, o que substitui a opção PATH by secure_path . Então adicione o caminho para a lista e você também pode usar env_keep , por exemplo:

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

Para verificar se seu PATH foi substituído, execute o seguinte 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

Veja também: Por que as variáveis PATH são diferentes quando executadas via sudo e su? no Unix SE

    
por kenorb 24.12.2015 / 19:28
0

Isso funciona para mim ( ~/.bashrc ):

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

Fonte: Como por OP editar

    
por kenorb 13.04.2017 / 14:25