O que acontece com o ambiente quando você executa “su -c”?

4

O que acontece com o ambiente quando você executa "su -c"?

A razão pela qual eu pergunto, é esse comportamento misterioso:

bash$ which firefox
/usr/local/bin/firefox
bash$ su - user -c "echo $PATH"
bin:/usr/bin:/sbin:/usr/sbin:/opt/java/bin:/usr/local/bin:... 
bash$ su - user -c "firefox ..."
-bash: firefox: command not found

Alguma idéia?

    
por ttsiodras 25.09.2010 / 17:15

2 respostas

3

O que você está vendo é o fato de que $PATH é expandido no shell dos primeiros usuários durante o processamento do argumento, antes que o comando su(1) seja executado, então parece que sempre acontece. Se você usar aspas duras ( 'echo $PATH' ), deverá ver algo diferente ou apenas \$ .

Isso preservará a sintaxe $PATH até que o comando su(1) seja executado. Embora normalmente não mexa com o ambiente, ele inicia um novo shell e, portanto, você deve verificar por PATH= lines nos vários scripts de inicialização do shell.

Seu su(1) tem uma opção -c , então você parece estar no Linux. Em um Mac ou um BSD você obteria um PATH simplificado em vez do login PATH , mas você ainda teria o mesmo "quando eu expandi o PATH?" questão.

    
por 25.09.2010 / 18:01
7

Quando su - ou su -l é usado, ele emula uma sessão de login, o que envolve a redefinição do ambiente para um estado limpo.

No Arch Linux, su - usa a string codificada em código /usr/ucb:/bin:/usr/bin:/etc como o novo $PATH . Em outros sistemas, ele pode ler ENV_SUPATH de /etc/login.defs ou confiar no PAM para configurar o ambiente.

su ... "echo $PATH" lies, porque a parte $PATH é expandida pelo seu shell atual, muito antes de o su ser lançado. Use su ... 'echo $PATH' (observe as aspas simples) ou su - -c env (imprime o ambiente completo).

    
por 25.09.2010 / 18:57

Tags