$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin
Pourquoi n'est-il pas $HOME
configuré /home/otheruser
même si bash est appelé en tant que shell de connexion?
Plus précisément, /home/otheruser/.bashrc
ne pas être source. En outre, /home/otheruser/.profile
ne pas être source. - ( /home/otheruser/.bash_profile
n'existe pas)
bash
sudo
environment-variables
utilisateur80551
la source
la source
Réponses:
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):
Exemple (avec un utilisateur spécifié):
Exemple (avec une commande):
Exemple (utilisateur d'impression
$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
.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 pourlocalhost
ainsi que pour d'autres hôtes et fournit une authentification par clé publique qui fonctionne sans aucune entrée interactive.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.
la source
sudo -i -u user echo \$HOME
ça ne marche pas pour moi. Sortie:$HOME
. strace donne le même résultat que le vôtre. Quel est le problème?Tu donnes trop de crédit à Bash. Tous les "shell de connexion" signifient que Bash indique quels fichiers sont générés au démarrage et à l’arrêt. La
$HOME
variable n'y figure pas.La documentation Bash explique plus en détail ce que le shell de connexion signifie: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files
En fait, Bash ne fait rien du
$HOME
tout.$HOME
est défini par tout ce qui appelle le shell (login, ssh, etc.), et le shell en hérite. Peu importe ce qui a commencé votre shell en tant qu'admin set$HOME
, puis exec-edbash
, desudo
par sa conception, il ne modifie pas l'environnement à moins d'y être invité ou configuré, de sortebash
qu'un autre utilisateur l'a hérité de votre shell.Si vous souhaitez
sudo
gérer davantage l'environnement que prévu, consultez le-i
commutateur sudo. Essayer:La page de manuel de sudo le décrit plus en détail, mais pas très bien, je pense: http://linux.die.net/man/8/sudo
la source
/bin/bash -l -c 'echo $HOME'
ligne de commande vous-même lorsque vous l'utilisez-i
.sudo
syntaxe a jeté une erreur sur ma machine. (su
utilise l'-c
option, mais je ne le pense passudo
.) J'ai eu plus de chance avec:HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
-S
(je n'en ai pas eu besoin, alors je l'ai laissé), mais-c
ça ne marche pas ici, il faut à la-s
place.