Como o PATH é definido para usuários no fantoche?

3

Estou tendo um interessante problema que Consegui contornar manualmente especificando PATH .

O problema é que, embora meu root user PATH seja:

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

Quando executo meu Puppet Master no NGINX / Passenger como usuário puppet , PATH de alguma forma é definido como:

/usr/sbin:/sbin

Onde a variável de ambiente PATH está definida para usuários e como posso garantir que meu usuário puppet tenha o PATH correto? O usuário não tem um shell:

puppet:x:103:106::/var/lib/puppet:/bin/false

No arquivo config.ru Rack responsável por iniciar o Puppet Master, inseri a seguinte declaração para ver com que PATH o usuário puppet está sendo executado:

puts "PATH: " + ENV.fetch('PATH', 'null')

A saída é PATH: null , portanto, a variável de ambiente PATH simplesmente não é definida quando o Passenger é executado.

Estou trabalhando em um contêiner do Docker executando o Ubuntu 14.04 amd64.

    
por Naftuli Kay 12.08.2014 / 20:47

2 respostas

1

Como é indicado na documentação do NGINX :

By default, nginx removes all environment variables inherited from its parent process except the TZ variable.

A solução para o meu problema específico pode ser alcançada de algumas maneiras diferentes.

Solução 1: Anexar a variável PATH em Ruby

Ao editar o arquivo config.ru , podemos simplesmente definir PATH , se ainda não estiver definido:

if not ENV['PATH']
    ENV['PATH'] = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
end

Isso é bastante simples e resolve o problema, mas está enterrado na configuração que você provavelmente nunca mais verá.

Solução alternativa 2: defina a variável PATH em NGINX

Ao definir a variável PATH na configuração do seu site NGINX, temos uma solução mais "imediatamente visível" para o problema:

server {
    listen 8140 ssl default_server;

    # ...
    # manually set PATH for Passenger; see PUP-3000
    env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    passenger_enabled on;
    # ...
}
    
por 20.08.2014 / 19:52
2

Em geral, o linux define a variável de ambiente PATH lendo os arquivos de ponto. Quando você faz o login, /etc/profile é lido. Depois de definir as variáveis de ambiente padrão, ele lê .shell_profile , que é, por exemplo, .bash_profile . Se esse arquivo de pontos não existir, ele tentará ler .bash_login e, se isso não existir, ele procurará .profile .

Vamos voltar à pergunta. O usuário puppet não possui shell ou não acomoda os arquivos mencionados acima. Você pode simplesmente verificá-lo executando echo "$SHELL" && echo "$PATH" .

Você pode definir PATH manualmente usando um dos arquivos de ponto ou ver o seguinte: link

    
por 12.08.2014 / 21:26