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?
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)).
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é.
Un moyen assez populaire pour obtenir Shell root utilise également:
$ Sudo su -
# id
uid=0(root) gid=0(root) groups=0(root)
# pwd
/root
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"