Para invocar um shell de login usando sudo
, use apenas -i
. Quando o comando não for especificado, você receberá um prompt de login, caso contrário, você 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 sinal de dólar atinja o shell do usuário de destino e não seja interpretado no shell do usuário de chamada.
Acabei de verificar o último exemplo com strace , que informa 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 em sua chamada explícita para bash, mas além disso, sudo pode fazer seu próprio trabalho, como configurar 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 não acho que seja uma boa técnica. Se você deseja executar comandos como um usuário diferente sem executar a autenticação do teclado, convém usar o SSH. Ele funciona para localhost
, bem como para 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 nenhuma opção especial com SSH, pois o servidor SSH sempre cria um shell de login para ser acessado pelo cliente SSH.