web-dev-qa-db-fra.com

Comment Sudo est-il configuré pour ne pas modifier $ HOME dans Ubuntu et comment désactiver ce comportement?

Sur Ubuntu 12.04, quand je Sudo -s la variable $ HOME n'est pas modifiée, donc si mon utilisateur régulier est regularuser, la situation se présente comme suit:

$ cd
$ pwd
/home/regularuser
$ Sudo -s
# cd
# pwd
/home/regularuser

J'ai abandonné Ubuntu il y a longtemps, donc je ne peux pas en être sûr, mais je pense que c'est le comportement par défaut. Donc, mes questions sont:

Q1. Comment cela se fait-il? Où est la config?

Q2. Comment le désactiver?

Edit: Merci pour les réponses, qui ont un peu clarifié les choses, mais je suppose que je dois ajouter quelques questions, pour obtenir la réponse que je cherche.

Q3. Dans Debian Sudo -s, change la variable $ HOME en /root. D'après ce que je reçois des réponses et man Sudo le shell a fonctionné avec Sudo -s est celui donné dans /etc/passwd, droite?

Q4. Cependant, sur Ubuntu et Debian, le shell donné dans /etc/passwd pour root est /bin/bash. Dans les deux systèmes également, je ne trouve pas où la différence de .profile ou .bashrc est, en ce qui concerne $ HOME, de sorte que le comportement de Sudo -s diffère. Une aide à ce sujet?

42
alxs

Sudo dispose de nombreuses options de configuration au moment de la compilation. Vous pouvez répertorier les paramètres de votre version avec Sudo -V. L'une des différences entre la configuration dans Debian Wheezy et dans Ubuntu 12.04 est que la variable d'environnement HOME est préservée dans Ubuntu mais pas dans Debian; les deux distributions effacent toutes les variables d'environnement à l'exception de quelques-unes qui sont explicitement marquées comme sûres à conserver. Donc Sudo -s conserve HOME sur Ubuntu, tandis que sur Debian HOME est effacé et Sudo le place ensuite dans le répertoire personnel de l'utilisateur cible.

Vous pouvez remplacer ce comportement dans le fichier sudoers . Exécutez visudo pour modifier le fichier sudoers. Il existe plusieurs options pertinentes:

  • env_keep détermine quelles variables d'environnement sont préservées. Utilisation Defaults env_keep += "HOME" pour conserver la variable d'environnement HOME de l'appelant ou Defaults env_keep -= "HOME" pour l'effacer (et le remplacer par le répertoire personnel de l'utilisateur cible).
  • env_reset détermine si les variables d'environnement sont réinitialisées. La réinitialisation des variables d'environnement est souvent nécessaire pour les règles qui permettent d'exécuter une commande spécifique, mais n'a pas d'avantage de sécurité direct pour les règles qui autorisent de toute façon l'exécution de commandes arbitraires.
  • always_set_home, s'il est défini, entraîne le remplacement de HOME même s'il a été conservé en raison de env_reset étant désactivé ou HOME étant dans le env_keep liste. Cette option n'a aucun effet si HOME n'est pas conservé de toute façon.
  • set_home est comme always_set_home, mais ne s'applique qu'à Sudo -s, pas lors de l'appel de Sudo avec une commande explicite.

Ces options peuvent être définies pour un utilisateur source donné, un utilisateur cible donné ou une commande donnée; voir le manuel sudoers pour plus de détails.

Vous pouvez toujours choisir de remplacer HOME pour un appel donné à Sudo en passant l'option -H.

Le shell ne remplacera jamais la valeur de HOME. (Il définirait HOME s'il n'était pas défini, mais Sudo définit toujours HOME d'une manière ou d'une autre.)

Si vous exécutez Sudo -i, Sudo simule une connexion initiale. Cela inclut la définition de HOME dans le répertoire de base de l'utilisateur cible et l'appel d'un shell de connexion .

Utilisation Sudo -H -i au lieu de Sudo -s pour obtenir un shell racine de connexion interactif:

Sudo -H -i
cd
pwd -P  #  /private/var/root  (on Mac OS X 10.6.8)

De man Sudo:

-H      The -H (HOME) option sets the HOME environment variable to
        the homedir of the target user (root by default) as
        specified in passwd(5).  By default, Sudo does not modify
        HOME (see set_home and always_set_home in sudoers(5)).
17
franco

Cela a peu à voir avec le comportement de Sudo et beaucoup à voir avec la différence entre un "shell de connexion" et un "shell sans connexion". La solution rapide est

$ Sudo -i

comme on peut le voir avec:

$ Sudo -s
# id
uid=0(root) gid=0(root) groups=0(root)
# echo $HOME
/home/msw
# exit
$ Sudo -i
# echo $HOME
/root
# pwd
/root

Comme indiqué dans le manuel Sudo:

L'option -i (simuler la connexion initiale) exécute le shell spécifié par l'entrée de la base de données de mots de passe de l'utilisateur cible en tant que shell de connexion. Cela signifie que les fichiers de ressources spécifiques à la connexion tels que .profile ou .login seront lus par le shell. Si une commande est spécifiée, elle est transmise au Shell pour exécution via l'option -c du Shell. Si aucune commande n'est spécifiée, un shell interactif est exécuté.

5
msw

Un moyen assez populaire pour obtenir Shell root utilise également:

 $ Sudo su - 
 # id
 uid=0(root) gid=0(root) groups=0(root)
 # pwd
 /root
2
Satanowski

Pour se débarrasser des différents comportements de Sudo -s sur Ubuntu et Debian respectivement, vous pouvez utiliser un wrapper Sudo (réponse à Q4):

sudos() {
   local PATH="$(getconf PATH)" root_homedir
   root_homedir="$(Sudo -H sh -c 'printf "%s" "$HOME"')"
   Sudo sh -c 'export HOME="$0"; exec sh -i' "$root_homedir"
   return 0
}

Sudo -k
sudos
{
logname
whoami
id -un
id -ur
echo "PATH: $PATH"
}
exit
echo "PATH: $PATH"
0
tacz