Como o sudo está configurado para não alterar $HOME no Ubuntu e como desabilitar esse comportamento?

Como o sudo está configurado para não alterar $HOME no Ubuntu e como desabilitar esse comportamento?

No Ubuntu 12.04, quando eu sudo -sa variável $HOME não é alterada, então se meu usuário regular for regularuser, a situação é assim:

$ cd
$ pwd
/home/regularuser
$ sudo -s
# cd
# pwd
/home/regularuser

Abandonei o Ubuntu há muito tempo, então não posso ter certeza, mas acho que esse é o comportamento padrão. Então, minhas perguntas são:

  1. Como isso é feito? Onde está a configuração?
  2. Como faço para desativá-lo?

Editar: Obrigado pelas respostas, que esclareceram um pouco as coisas, mas acho que devo acrescentar algumas perguntas para obter a resposta que procuro.

  1. No Debian sudo -s, altera a variável $HOME para /root. Pelo que recebo das respostas e man sudodo shell executado sudo -sé aquele fornecido /etc/passwd, certo?
  2. No entanto, tanto no Ubuntu quanto no Debian, o shell fornecido /etc/passwdpara root é /bin/bash. Também em qualquer sistema, não consigo encontrar onde está a diferença nos arquivos .profileor .bashrc, no que diz respeito a $HOME, de modo que o comportamento de sudo -sé diferente. Alguma ajuda sobre isso?

Responder1

Sudo tem muitas opções de configuração em tempo de compilação. Você pode listar as configurações da sua versão com sudo -V. Uma das diferenças entre a configuração no Debian wheezy e no Ubuntu 12.04 é que a HOMEvariável de ambiente é preservada no Ubuntu, mas não no Debian; ambas as distribuições apagam todas as variáveis ​​de ambiente, exceto algumas que estão explicitamente marcadas como seguras para preservação. Assim, sudo -spreserva HOMEno Ubuntu, enquanto no Debian HOMEé apagado e sudodepois definido para o diretório inicial do usuário alvo.

Você pode substituir esse comportamento nosudoersarquivo. Execute visudopara editar o sudoersarquivo. Existem várias opções relevantes:

  • env_keepdetermina quais variáveis ​​de ambiente são preservadas. Use Defaults env_keep += "HOME"para reter a variável de ambiente do chamador HOMEou Defaults env_keep -= "HOME"para apagá-la (e substituí-la pelo diretório inicial do usuário de destino).
  • env_resetdetermina se as variáveis ​​de ambiente serão redefinidas. A redefinição de variáveis ​​de ambiente geralmente é necessária para regras que permitem a execução de um comando específico, mas não traz um benefício direto de segurança para regras que permitem a execução de comandos arbitrários de qualquer maneira.
  • always_set_home, se definido, faz com HOMEque seja substituído mesmo que tenha sido preservado por env_resetestar desabilitado ou HOMEestar na env_keeplista. Esta opção não terá efeito se HOMEnão for preservada de qualquer maneira.
  • set_homeé semelhante a always_set_home, mas só se aplica a sudo -s, não ao chamar sudocom um comando explícito.

Essas opções podem ser definidas para um determinado usuário de origem, um determinado usuário de destino ou um determinado comando; consulte o sudoersmanual para obter detalhes.

Você sempre pode optar por substituir HOMEuma determinada chamada sudopassando a opção -H.

O shell nunca substituirá o valor de HOME. (Seria definido HOMEse não estivesse definido, mas sudosempre é definido HOMEde uma forma ou de outra.)

Se você executar sudo -i, sudosimula um login inicial. Isso inclui definir HOMEo diretório inicial do usuário de destino e invocar umshell de login.

Responder2

Use sudo -H -iem vez de sudo -spara obter um shell raiz de login interativo:

sudo -H -i
cd
pwd -P  #  /private/var/root  (on Mac OS X 10.6.8)

De man sudo:

-H      The -H (HOME) option sets the HOME environment variable to
        the homedir of the target user (root by default) as
        specified in passwd(5).  By default, sudo does not modify
        HOME (see set_home and always_set_home in sudoers(5)).

Responder3

Isso tem pouco a ver com o comportamento sudoe muito a ver com a diferença entre um "shell de login" e um "shell sem login". A solução rápida é

$ sudo -i

como pode ser visto com:

$ sudo -s
# id
uid=0(root) gid=0(root) groups=0(root)
# echo $HOME
/home/msw
# exit
$ sudo -i
# echo $HOME
/root
# pwd
/root

Conforme observado no manual do sudo:

A opção -i (simular login inicial) executa o shell especificado pela entrada do banco de dados de senha do usuário alvo como um shell de login. Isso significa que arquivos de recursos específicos de login, como .profile ou .login, serão lidos pelo shell. Se um comando for especificado, ele será passado ao shell para execução por meio da opção -c do shell. Se nenhum comando for especificado, um shell interativo será executado.

Responder4

Para se livrar do comportamento diferente sudo -sno Ubuntu e no Debian respectivamente, você poderia usar um sudowrapper (resposta ao quarto trimestre):

sudos() {
   local PATH="$(getconf PATH)" root_homedir
   root_homedir="$(sudo -H sh -c 'printf "%s" "$HOME"')"
   sudo sh -c 'export HOME="$0"; exec sh -i' "$root_homedir"
   return 0
}

sudo -k
sudos
{
logname
whoami
id -un
id -ur
echo "PATH: $PATH"
}
exit
echo "PATH: $PATH"

informação relacionada