web-dev-qa-db-fra.com

sudo comme un autre utilisateur avec son environnement

$ whoami
admin
$ Sudo -S -u otheruser whoami
otheruser
$ Sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin

Pourquoi n'est-ce pas $HOME étant défini sur /home/otheruser même si bash est invoqué en tant que shell de connexion?

Plus précisément, /home/otheruser/.bashrc ne provient pas. Aussi, /home/otheruser/.profile ne provient pas. - (/home/otheruser/.bash_profile n'existe pas)

64
user80551

Pour appeler un shell de connexion à l'aide de Sudo utilisez simplement -i. Lorsque la commande n'est pas spécifiée, vous obtiendrez une invite de connexion au shell, sinon vous obtiendrez la sortie 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 (imprimer l'utilisateur $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 indique exactement ce qui se passe. Le soufflet de sortie montre que le Shell est appelé avec --login et avec la commande spécifiée, tout comme dans votre appel explicite à bash, mais en plus Sudo peut faire son propre travail comme définir le $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 à partir du clavier, vous pouvez utiliser SSH à la place. 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 pas besoin d'options spéciales avec SSH car le serveur SSH crée toujours un shell de connexion accessible par le client SSH.

94
Pavel Šimerda

Vous donnez trop de crédit à Bash. Tout "shell de connexion" signifie pour Bash que les fichiers proviennent du démarrage et de l'arrêt. Le $HOME la variable n'y figure pas.

Les documents Bash expliquent un peu plus ce que signifie le shell de connexion: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files

En fait, Bash ne fait rien pour définir $HOME du tout. $HOME est défini par ce qui appelle le shell (login, ssh, etc.), et le shell en hérite. Quel que soit le démarrage de votre shell en tant qu'administrateur $HOME puis exécutée bash, Sudo par conception ne modifie pas l'environnement à moins que cela ne soit demandé ou configuré pour le faire, donc bash comme autre utilisateur l'a hérité de votre Shell .

Si vous voulez que Sudo gère davantage l'environnement de la manière que vous attendez, regardez le -i changer pour Sudo. Essayer:

Sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME'

La page de manuel de Sudo le décrit plus en détail, mais pas vraiment bien, je pense: http://linux.die.net/man/8/Sudo

10
Jeff Snider