Como faço para o sudo preservar minhas variáveis de ambiente?

45

Usando o sudo 1.7.4p4 no Solaris 5.10 e o sudo 1.6.7p5 no RHEL4 u6 Não consigo ver como preservar minhas variáveis de ambiente, por exemplo, $ PYTHONPATH. Eu adicionei esta linha aos sudoers, mas não faz diferença alguma:

Defaults !env_reset

Estou fazendo algo errado ou a instalação do sudo simplesmente não está respeitando o sinalizador env_reset?

Editar: Pelo menos no Solaris, descobrimos que esse problema depende do shell! O shell de raiz padrão é Bourne, se executarmos o bash sob sudo ( sudo bash ), por outro lado,! Env_preset preservará o ambiente (incluindo PATH e LD_LIBRARY_PATH). Este é um comportamento bastante confuso que tenho a dizer.

    
por aknuds1 12.01.2011 / 14:04

4 respostas

41

Use com cuidado, há problemas de segurança com sudo e variáveis.

De man sudoers achei que você deveria usar

Defaults        env_reset
Defaults        env_keep += "PYTHONPATH OTHERVARIABLE YETANOTHER"

No Ubuntu, sudo preserva algumas variáveis. sudo -i é mais como efetuar login como root e depois executar o comando. Ambos podem ser inconvenientes, o primeiro para sudo nano myfile deixa os arquivos de propriedade da raiz dentro de sua casa e o último para sudo -i nano myfile tentará abrir / root / myfile.

Executar

sudo printenv PATH

e veja o que isso dá. Aqui dá

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

por exemplo. Agora execute sudo visudo e adicione a linha

Defaults        secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

substituindo pelo que você encontrou antes. Anexe um novo caminho a ele, se precisar.

Sobre bibliotecas:

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

As distribuições Linux levam muita cuidado com PATH , e você deve ter cuidado antes de brincar com ele. Seja especialmente cuidadoso ao adicionar caminhos como " . " ou /home/username , não é seguro.

Um dos perigos de adicionar caminhos é que ele abre a possibilidade de arquivos nesses caminhos serem executados por root , abrindo uma janela na segurança do sistema que pode ser explorada por software mal-intencionado. Pode haver outros perigos. Apenas certifique-se de que você sabe o que está fazendo. Ignorar sudo medidas de segurança podem tornar seu Solaris tão seguro quanto o Windows XP.

    
por 12.01.2011 / 15:13
8

Brincar com sudoers deve ser feito com cautela, como outros já disseram.

Uma abordagem mais simples para casos mais simples, quando há determinadas variáveis de ambiente que você deseja preservar, é passar a variável de ambiente desejada diretamente pelo sudo (isso é mostrado como [VAR=value] na ajuda do sudo cmdline).

Veja este pequeno exemplo onde também demonstrei isso para mais de uma variável.

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

Para o exemplo original de PYTHONPATH na pergunta, use o seguinte:

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

Criar um alias para esse tipo de coisa é útil. Assim:

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH'
    
por 10.05.2012 / 18:21
3

Seu Defaults !env_reset parece OK, presumindo que você não esteja chamando o sudo com a opção -E .

Você pode tentar remover essa entrada completamente.

Você verificou que está editando o arquivo sudoers correto? Eu estou supondo que poderia ser /etc/sudoers ou /usr/local/etc/sudoers dependendo de como ele foi instalado. Você editou usando visudo ?

Como você está executando o sudo? sudo python , sudo su , sudo su - , sudo -s , algo mais? Somente sudo python e sudo su preservariam seu ambiente.

O que env | grep PYTHONPATH diz? Se nada, verifique se PYTHONPATH foi exportado executando export PYTHONPATH e tente novamente.

O que sudo env | grep PYTHONPATH diz? Se ele imprime o valor esperado, outra coisa substitui seu valor PYTHONPATH. Talvez o .bashrc ou .bash_profile do root ou os arquivos de configuração do sistema.

    
por 12.01.2011 / 14:36
-1

De acordo com documentação do Ubuntu para LD_LIBRARY_PATH :

You must use /etc/ld.so.conf.d/*.conf configuration files

Então:

  1. Adicione um arquivo de configuração ld.so em /etc/ld.so.conf.d/ com o caminho do seu LD_LIBRARY_PATH

  2. Atualize o cache com:

    sudo ldconfig -v
    
por 02.06.2016 / 11:49