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

39

Eu tenho um script bash myhome.shcontendo 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 , recebo:

$ echo $HOME
/home/user

$ sudo echo $HOME
/home/user

$ bash myhome.sh
/home/user

$ sudo bash myhome.sh
/home/user

No 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

Não entendo por que, dentro do script do Debian, se ele é executado com o sudo, eu sempre entro $HOME=/rootno Ubuntu $HOME=/home/user. Alguém sabe o que os desenvolvedores do Ubuntu mudaram?

ceccoemi
fonte

Respostas:

68

O Debian e o Ubuntu enviam um /etc/sudoersarquivo que contém Defaults env_reset, que redefine as variáveis ​​de ambiente.

No entanto, o comportamento de env_resetfoi alterado de não tocar em $ HOME para redefini-lo para a casa do usuário de destino.

O Ubuntu decidiu corrigir a versão deles sudopara manter o comportamento anterior: https://bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140

No Ubuntu, para redefinir a variável de ambiente $ HOME para o usuário de destino, é preciso definir um Defaults always_set_homeou Defaults set_home(nesse caso, apenas sudo -so HOME será atualizado) /etc/sudoers.

Este bug no rastreador Ubuntu tem um pouco mais de razão para não definir $ HOME no sudo: https://bugs.launchpad.net/ubuntu/+source/sudo/+bug/1373495

Veja o comentário 4:

Se o HOME for removido, por exemplo, vim, bash, etc., usará /root/.vimrc, /root/.bashrc, etc, em vez do ~ / .vimrc, ~ / .bashrc do usuário, etc. Embora seja uma má ideia Para executar clientes X via sudo, eles também provavelmente procurariam nos locais errados arquivos de configuração, e há uma chance de que os clientes X11 nem consigam se conectar ao servidor X11 se estiverem direcionados ao arquivo .Xauthority errado.

É uma decisão consciente dos desenvolvedores do Ubuntu.

Esta resposta tem mais detalhes sobre as opções de sudoers, como always_set_home: https://unix.stackexchange.com/a/91572/281844


Há uma segunda questão na sua pergunta, sudo echo $HOMEque ainda mostra a casa do usuário, mesmo no Debian.

Isso acontece porque o shell está se expandindo $HOME antes de executar o sudocomando.

Então, é isso:

$ sudo echo $HOME

É primeiro expandido pelo shell para:

$ sudo echo /home/user

E então o sudo executa echo /home/usercomo root ...

Isso deve demonstrar a diferença também:

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

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

$ sudo -s
# echo $HOME
/root
filbranden
fonte