sudo não preserva PYTHONPATH

5

Eu modifiquei o / etc / sudoers (usando visudo) para manter as variáveis de ambiente:

Defaults        !env_reset

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

#includedir /etc/sudoers.d
www ALL = NOPASSWD: /usr/bin/env

Isso funciona quase bem: todas as variáveis de ambiente são preservadas, exceto PYTHONPATH!

www@myhost:~$ env | grep PYTHON
PYTHONPATH=/home/www/python_commons:/home/www/python_commons/django_commons/apps:/home/www
www@myhost:~$ sudo env | grep PYTHON
www@myhost:~$

Eu tentei adicionar isso em sudoers:

Defaults        env_keep += "PYTHONPATH"

Mas isso não ajuda.

Estou usando o Ubuntu 11.10: como preservar o PYTHONPATH?

    
por Eric 02.12.2011 / 11:18

1 resposta

5

Você é muito próximo: não cite PYTHONPATH, como mostrado abaixo.

Defaults    env_keep += PYTHONPATH

Você não precisa modificar o env_reset.

Você também pode considerar não alterar os sudoers. Em vez disso, considere invocar sudo assim:

sudo PYTHONPATH=$PYTHONPATH <command...>

Isso também funciona com o PATH e outras variáveis. Quando expandido pelo shell, você obtém caminhos literais como se tivesse digitado

sudo PYTHONPATH=/home/www/python_commons:... <command>

mas somente quando você solicitar explicitamente para passá-lo (ao contrário de implicitamente com env_keep).

Isso funciona porque o sudo permite que você passe variáveis de ambiente existentes, o que requer env_keep, ou que especifique variáveis env para serem definidas apenas para o comando sudo, que não requer env_keep. Considere isto:

snafu$ sudo grep Def /etc/sudoers
Defaults    env_reset
Defaults    env_keep += SE_ok
Defaults    env_keep += SE_ik

snafu$ SE_o=outer SE_ok=outer_keep sudo SE_i=inner SE_ik=inner_keep env | grep ^SE
SE_ok=outer_keep
SE_ik=inner_keep
SE_i=inner

Este exemplo demonstra as variáveis de configuração no ambiente de chamada de sudo (externo) e no próprio sudo (interno). Note que SE_i é impresso mesmo que não haja entrada env_keep para ele. (env_keep para SE_ik é desnecessário.) Observe também que env_keep se aplica a variáveis externas (SE_o não é impresso).

[Invocações de comandos do para 'var = val comando' são equivalentes a (export var = val; comando). Ou seja, eles configuram uma ou mais variáveis de ambiente apenas para esse comando.]

    
por 24.12.2011 / 19:14

Tags