Para invocar un shell de inicio de sesión sudo
simplemente use -i
. Cuando no se especifica el comando, recibirá un indicador de shell de inicio de sesión; de lo contrario, obtendrá el resultado de su comando.
Ejemplo (shell de inicio de sesión):
sudo -i
Ejemplo (con un usuario especificado):
sudo -i -u user
Ejemplo (con un comando):
sudo -i -u user whoami
Ejemplo (usuario de impresión $HOME
):
sudo -i -u user echo \$HOME
Nota: El carácter de barra diagonal inversa asegura que el signo de dólar llegue al shell del usuario objetivo y no se interprete en el shell del usuario llamante.
Acabo de comprobar el último ejemplo con strace que te dice exactamente lo que está sucediendo. El siguiente resultado muestra que se llama al shell con --login
y con el comando especificado, al igual que en su llamada explícita a bash, pero además sudo puede hacer su propio trabajo como configurar el $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
...
Noté que estás usando -S
y no creo que sea una buena técnica en general. Si desea ejecutar comandos como un usuario diferente sin realizar la autenticación desde el teclado, puede utilizar SSH en su lugar. Funciona localhost
tanto como para otros hosts y proporciona autenticación de clave pública que funciona sin ninguna entrada interactiva.
ssh user@localhost echo \$HOME
Nota: No necesita ninguna opción especial con SSH ya que el servidor SSH siempre crea un shell de inicio de sesión para que el cliente SSH acceda a él.