Per invocare una shell di accesso, sudo
basta usare -i
. Quando il comando non viene specificato, verrà visualizzato un prompt della shell di accesso, altrimenti verrà visualizzato l'output del comando.
Esempio (shell di login):
sudo -i
Esempio (con un utente specificato):
sudo -i -u user
Esempio (con un comando):
sudo -i -u user whoami
Esempio (utente di stampa $HOME
):
sudo -i -u user echo \$HOME
Nota: il carattere barra rovesciata assicura che il simbolo del dollaro raggiunga la shell dell'utente di destinazione e non sia interpretato nella shell dell'utente chiamante.
Ho appena controllato l'ultimo esempio con strace che ti dice esattamente cosa sta succedendo. Il muggito di output mostra che la shell viene chiamata con --login
e con il comando specificato, proprio come nella tua chiamata esplicita a bash, ma in più sudo può fare il suo lavoro come impostare il file $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
...
Ho notato che stai usando -S
e non penso che sia generalmente una buona tecnica. Se si desidera eseguire comandi come utente diverso senza eseguire l'autenticazione dalla tastiera, è possibile utilizzare SSH. Funziona localhost
sia per altri host sia per l'autenticazione con chiave pubblica che funziona senza input interattivi.
ssh user@localhost echo \$HOME
Nota: non è necessaria alcuna opzione speciale con SSH poiché il server SSH crea sempre una shell di accesso a cui il client SSH può accedere.