Pour invoquer un shell de connexion en utilisant sudo
simplement utiliser -i
. Lorsque la commande n'est pas spécifiée, vous obtenez une invite du shell de connexion, sinon vous obtenez le résultat de votre commande.
Exemple (shell de connexion):
sudo -i
Exemple (avec un utilisateur spécifié):
sudo -i -u user
Exemple (avec une commande):
sudo -i -u user whoami
Exemple (utilisateur d'impression $HOME
):
sudo -i -u user echo \$HOME
Remarque: le caractère barre oblique inverse garantit que le signe dollar atteint le shell de l'utilisateur cible et n'est pas interprété dans le shell de l'utilisateur appelant.
Je viens de vérifier le dernier exemple avec strace qui vous dit exactement ce qui se passe. Le résultat ci-dessous montre que le shell est appelé avec --login
et avec la commande spécifiée, exactement comme dans votre appel explicite à bash, mais en plus, sudo peut effectuer son propre travail comme définir le fichier $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
...
J'ai remarqué que vous utilisez -S
et je ne pense pas que ce soit généralement une bonne technique. Si vous souhaitez exécuter des commandes en tant qu'utilisateur différent sans effectuer d'authentification à l'aide du clavier, vous pouvez utiliser plutôt SSH. Il fonctionne pour localhost
ainsi que pour d'autres hôtes et fournit une authentification par clé publique qui fonctionne sans aucune entrée interactive.
ssh user@localhost echo \$HOME
Remarque: vous n'avez besoin d'aucune option spéciale avec SSH car le serveur SSH crée toujours un shell de connexion accessible au client SSH.