Como o Ubuntu e o Debian gerenciam o $ HOME para usuários com privilégios de sudo?

37

Eu tenho um script bash myhome.sh contendo apenas uma linha:

echo $HOME

O proprietário do script é um usuário:

$ ls -l myhome.sh
-rw-rw-r-- 1 user user <date> <time> myhome.sh

No Ubuntu 16.04 e 17.10 eu recebo:

$ echo $HOME
/home/user

$ sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

$ sudo bash myhome.sh
/home/user

Em Debian Buster / Testing eu recebo:

$ echo $HOME
/home/user

$ sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

# WHY ?
$ sudo bash myhome.sh
/root

Eu não entendo porque dentro do script no Debian, se ele é executado com o sudo, eu sempre recebo $HOME=/root enquanto no Ubuntu eu recebo $HOME=/home/user . Alguém sabe o que os desenvolvedores do Ubuntu mudaram?

    
por ceccoemi 18.04.2018 / 19:38

1 resposta

67

Tanto o Debian quanto o Ubuntu enviam um arquivo /etc/sudoers que contém Defaults env_reset , que redefine as variáveis de ambiente.

No entanto, o comportamento de env_reset foi alterado de não tocando em $ HOME para redefini-lo na casa do usuário de destino.

O Ubuntu decidiu corrigir sua versão de sudo para manter o comportamento anterior: link

No Ubuntu, para redefinir a variável de ambiente $ HOME para o usuário de destino, é necessário definir Defaults always_set_home ou Defaults set_home (caso em que somente sudo -s obterá a atualização de HOME) em /etc/sudoers .

Esse bug no rastreador do Ubuntu tem um pouco mais de racionalidade em não configurar o $ HOME no sudo: link

Veja o comentário # 4:

If HOME is removed, then e.g. vim, bash, etc., will use /root/.vimrc, /root/.bashrc, etc rather than the user's ~/.vimrc, ~/.bashrc, etc. While it's a bad idea to run X clients via sudo, they too would likely look in the wrong locations for configuration files, and there's a chance that X11 clients may not even be able to connect to the X11 server if they are aimed at the wrong .Xauthority file.

É uma decisão consciente dos desenvolvedores do Ubuntu.

Esta resposta tem mais detalhes sobre as opções de sudoers, como always_set_home : link

Há um segundo problema em sua pergunta, que é o sudo echo $HOME , que ainda exibe a casa do usuário, mesmo no Debian.

Isso acontece porque o shell está expandindo $HOME antes executando o comando sudo .

Então isso:

$ sudo echo $HOME

Primeiro é expandido pelo shell em:

$ sudo echo /home/user

E, em seguida, o sudo executa echo /home/user como root ...

Isso também deve demonstrar a diferença:

$ sudo bash -c 'echo $HOME'
/root

Ou obtenha um shell root completo e veja a variável de ambiente:

$ sudo -s
# echo $HOME
/root
    
por 18.04.2018 / 19:51