Variáveis ​​de ambiente quando executadas com 'sudo'

48

Como exemplo para minha pergunta, meu ~/.bashrcarquivo 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) possa encontrar bibliotecas que ele precisa executar, pois é construído com os compiladores MKL e Intel. Esse 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 o programa com 'sudo' (mas não como 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 -iou sudo -Enão mudam nada aqui.


Editar:

Não consigo responder à minha pergunta (não há pontos suficientes: D), mas vou comentar aqui, na esperança de que haja outros novatos no Linux se perguntando sobre as sudoarmadilhas.

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

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

Respostas:

57

As variáveis ​​de ambiente podem ser simplesmente passadas depois sudono formato ENV = VALUE e serão aceitas pelo comando seguido. Não se sabe se existem restrições a esse uso, portanto, 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"
zetah
fonte
Ainda hoje isso funcionou para mim, na minha Raspbian Jessy para o meu RPi 3 ... depois de quase uma semana quebrando minha cabeça, por que meu script não foi executado na inicialização. Muito obrigado!
precisa saber é o seguinte
21

A -Eopção mencionada parece funcionar muito bem:

enzotib@host:~$ export DUMMY=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=dummy
enzotib
fonte
Desculpe, mas não entendo sua resposta. Você pode fornecer um exemplo no cenário que eu postei acima? ou seja, ser capaz de executar sudo python -c "import numpy"com LD_LIBRARY_PATHe LD_PRELOADdefinido como escrito acima?
Zetah 20/08/11
2
@ zetah: ok, eu estou errado, porque funciona para variáveis ​​genéricas, mas não para variáveis ​​de controle de vínculo dinâmico, como indicado na seção SECURITY NOTESda sudopágina de manual.
enzotib 20/08/11
É mais simples que (como na resposta fornecida), embora man sudonão esclareça, e quando o usuário tenta seguir as referências apontadas para ele, é muito fácil desanimar com todos os ramos que precisam ser seguidos, para poder descriptografar significado.
Zetah 20/08
14

Você pode usar a -Eopção sudo para preservar o ambiente atual (se você tiver direitos para 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.
Eugen Konkov
fonte
8

Você precisa editar o seu sudoersby, sudo visudopois possivelmente ativou o plug-in de política de segurança que substitui o seu PATHpor secure_path. Portanto, adicione o caminho à lista e você também pode usar env_keep, por exemplo:

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

Para verificar se o seu PATHfoi 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 ao executar via sudo e su? no Unix SE

kenorb
fonte
+1, mas env_keepnão funciona no PATH (no sentido de que sudoainda usa secure_pathquando se olha para o comando)
Zanna
0

Isso funciona para mim ( ~/.bashrc):

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

Fonte: conforme a edição do OP

kenorb
fonte
1
isso funciona, mas é uma má idéia porque faz correr sudomenos seguro
Zanna