Por que as variáveis PATH são diferentes quando executadas via sudo e su?

35

Na minha VM do fedora, quando rodando com minha conta de usuário, eu tenho /usr/local/bin no meu caminho:

[justin@justin-fedora12 ~]$ env | grep PATH
 PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin

E, da mesma forma, ao executar su :

[justin@justin-fedora12 ~]$ su -
Password: 
[root@justin-fedora12 justin]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin

No entanto, ao executar via sudo , esse diretório não está no caminho:

[root@justin-fedora12 justin]# exit
[justin@justin-fedora12 ~]$ sudo bash
[root@justin-fedora12 ~]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin

Por que o caminho seria diferente quando executado via sudo ?

    
por Justin Ethier 05.03.2011 / 15:50

6 respostas

35

Dê uma olhada em /etc/sudoers . O arquivo padrão no Fedora (assim como no RHEL, e também no Ubuntu e similares) inclui esta linha:

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

O que garante que seu caminho esteja limpo ao executar binários sob o sudo. Isso ajuda a proteger contra algumas das preocupações mencionadas nesta questão . Também é conveniente se você não tiver /sbin e /usr/sbin em seu próprio caminho.

    
por 05.03.2011 / 16:19
6

O comando su - executará o perfil de usuários raiz e assumirá o ambiente desse usuário, incluindo o caminho etc. sudo não faz isso.

Se você quiser que sudo se comporte como su - , use a opção sudo -i [command , que executará o perfil do usuário

Se você quiser que su - se comporte como sudo , não use o hífen - use apenas su [command]

    
por 06.03.2011 / 19:25
1

Na maioria dos linuxes, você instala programas através do gerenciamento de pacotes e obtém atualizações de maneira regular. Se você instalar algo contornando o gerenciamento de pacotes, ele será instalado em / usr / local / bin (por exemplo, ou ... / sbin, ou / opt) e não receberá atualizações regulares.

Acho, portanto, que os programas não são considerados seguros e não são colocados no PATH raiz por padrão.

    
por 05.03.2011 / 16:05
1

Eu apenas tentei isso para mim e não vi o comportamento que você estava vendo - meu caminho permaneceu o mesmo, então talvez sua configuração do sudo seja diferente. Se você marcar man sudoers , verá que há uma opção chamada secure_path que redefine PATH - parece que essa opção pode ter sido ativada.

    
por 05.03.2011 / 16:16
1

Porque quando você usa sudo bash , bash não atua como um shell de login. Tente novamente com sudo bash -l e você verá o mesmo resultado que su - .

Se isso estiver correto, a diferença em PATH está nos arquivos de configuração: /etc/profile , ~/.bash_profile , ~/.bash_login , ~/.profile são executados (nessa ordem) para um shell de login, enquanto ~/.bashrc é executado para um shell interativo sem login.

    
por 05.03.2011 / 16:22
1

Você pode verificar por que (é diferente) pelo 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

como por padrão plugin de política de segurança em algumas distribuições Linux.

Isso é explicado em mais detalhes em man sudoers :

If the secure_path option is set, its value will be used for the PATH environment variable.

secure_path - Path used for every command run from sudo. If you don't trust the people running sudo to have a sane PATH environment variable you may want to use this.

Another use is if you want to have the “root path” be separate from the “user path”. Users in the group specified by the exempt_group option are not affected by secure_path. This option is not set by default.

Se for esse o caso, você pode alterar isso executando sudo visudo e editando o arquivo de configuração e modificando seu secure_path (adicionando caminho extra separado por : ) ou adicionando seu usuário em exempt_group (assim você ganhou pode ser afetado por secure_path opções).

Ou para passar o PATH temporário do usuário, você pode executar:

sudo env PATH="$PATH" my_command

e você pode verificar isso por:

sudo env PATH="$PATH" env | grep ^PATH

Veja também: Como tornar sudo preserve $PATH ?

Outra razão pela qual o ambiente pode ser diferente para sudo , é porque você pode ter a opção env_reset ativada em seu arquivo sudoers . Isso faz com que os comandos sejam executados com um novo ambiente mínimo.

Portanto, você pode usar a opção env_keep (não recomendada para motivos de segurança ) para preservar as variáveis de ambiente do usuário :

Defaults        env_reset
Defaults        env_keep += "PATH PYTHONPATH"
    
por 24.12.2015 / 18:35