
No Ubuntu 12.04, quando eu sudo -s
a 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:
- Como isso é feito? Onde está a configuração?
- 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.
- No Debian
sudo -s
, altera a variável $HOME para/root
. Pelo que recebo das respostas eman sudo
do shell executadosudo -s
é aquele fornecido/etc/passwd
, certo? - No entanto, tanto no Ubuntu quanto no Debian, o shell fornecido
/etc/passwd
para root é/bin/bash
. Também em qualquer sistema, não consigo encontrar onde está a diferença nos arquivos.profile
or.bashrc
, no que diz respeito a $HOME, de modo que o comportamento desudo -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 HOME
variá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 -s
preserva HOME
no Ubuntu, enquanto no Debian HOME
é apagado e sudo
depois definido para o diretório inicial do usuário alvo.
Você pode substituir esse comportamento nosudoers
arquivo. Execute visudo
para editar o sudoers
arquivo. Existem várias opções relevantes:
env_keep
determina quais variáveis de ambiente são preservadas. UseDefaults env_keep += "HOME"
para reter a variável de ambiente do chamadorHOME
ouDefaults env_keep -= "HOME"
para apagá-la (e substituí-la pelo diretório inicial do usuário de destino).env_reset
determina 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 comHOME
que seja substituído mesmo que tenha sido preservado porenv_reset
estar desabilitado ouHOME
estar naenv_keep
lista. Esta opção não terá efeito seHOME
não for preservada de qualquer maneira.set_home
é semelhante aalways_set_home
, mas só se aplica asudo -s
, não ao chamarsudo
com 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 sudoers
manual para obter detalhes.
Você sempre pode optar por substituir HOME
uma determinada chamada sudo
passando a opção -H
.
O shell nunca substituirá o valor de HOME
. (Seria definido HOME
se não estivesse definido, mas sudo
sempre é definido HOME
de uma forma ou de outra.)
Se você executar sudo -i
, sudo
simula um login inicial. Isso inclui definir HOME
o diretório inicial do usuário de destino e invocar umshell de login.
Responder2
Use sudo -H -i
em vez de sudo -s
para 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 sudo
e 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 -s
no Ubuntu e no Debian respectivamente, você poderia usar um sudo
wrapper (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"