Para chamar um shell de login usando sudo
apenas use -i
. Quando o comando não for especificado, você receberá um prompt de shell de login, caso contrário, obterá a saída do seu comando.
Exemplo (shell de login):
sudo -i
Exemplo (com um usuário especificado):
sudo -i -u user
Exemplo (com um comando):
sudo -i -u user whoami
Exemplo (usuário de impressão $HOME
):
sudo -i -u user echo \$HOME
Nota: O caractere de barra invertida garante que o cifrão alcance o shell do usuário de destino e não seja interpretado no shell do usuário que está chamando.
Acabei de verificar o último exemplo com strace, que diz exatamente o que está acontecendo. A saída abaixo mostra que o shell está sendo chamado com --login
e com o comando especificado, assim como na sua chamada explícita para o bash, mas, além disso, o sudo pode fazer seu próprio trabalho, como definir o $HOME
.
# strace -f -e process sudo -S -i -u user echo \$HOME
execve("/usr/bin/sudo", ["sudo", "-S", "-i", "-u", "user", "echo", "$HOME"], [/* 42 vars */]) = 0
...
[pid 12270] execve("/bin/bash", ["-bash", "--login", "-c", "echo \\$HOME"], [/* 16 vars */]) = 0
...
Notei que você está usando -S
e geralmente não acho que seja uma boa técnica. Se você deseja executar comandos como um usuário diferente sem executar autenticação no teclado, pode usar o SSH. Ele funciona para localhost
outros hosts e fornece autenticação de chave pública que funciona sem nenhuma entrada interativa.
ssh user@localhost echo \$HOME
Nota: Você não precisa de opções especiais com o SSH, pois o servidor SSH sempre cria um shell de login para ser acessado pelo cliente SSH.