$ 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)
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.
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