Probleme variables d'environnement après utilisation de la commande su - (avec un tiret)

Tags: #<Tag:0x00007f50a25cd9c0> #<Tag:0x00007f50a25cd858>

Bonjour,

J’ai utilisé la commande su - (avec un tiret) et les variables d’environnements se sont échangées entre l’utilisateur root et l’utilisateur normal…
Cela a modifié plusieurs variables d’environnement dont $PWD :
Maintenant lorsque je me connecte avec l’utilisateur root j’atterris dans le répertoire de l’utilisateur normal et inversement.
Comment revenir en arrière s’ils-vous-plaît ?

Normale, effectivement.

C’est à dire ?

Lorsque tu te connecte avec su - root, tu fais en suite un exit pour quitter cet utilisateur, idem avec n’importe quel utilisateur d’ailleurs.

C’est à dire ?
Lorsque je fais un su root j’arrive maintenant dans le répertoire /home/clement de mon compte au lieu de /root.
Les valeurs des variables $pwd, $home, $logname de l’utilisateur root ont été remplacées par celle de l’utilisateur clement…

Nope … si tu cherches à basculer d’un utilisateur à un autre et qu’il faille impérativement récupérer les variable d’environnement ile te faut systématiquement utiliser le -

Lors de l’utilisation de su, tu bascules l’utilisateur sans son environnement.
Par contre si tu utilise su - , tu bascules avec les variables d’environnement de l’utilisateur invoqué.


       -, -l, --login
           Fournir  à l'utilisateur  un environnement similaire  à celui qu'il
           aurait obtenu s'il s'était connecté directement.

           Lorsque - est utilisé, il doit être indiqué comme dernier paramètre
           de su.  Les autres formes (-l et --login)  ne présentent pas  cette
           restriction.

https://www.man-linux-magique.net/man1/su.html

Quand tu utilises juste su, tu gardes l’environnement d’origine et tu bascule sur le user cible (mais sans l’environnement du user cible).
Avec su - tu bascules vers l’utilisateur cible avec l’environnement de l’utilisateur cible.

Mais je comprends pas.
L’utilisateur normal étant « clement ».
Quand je me connecte sur root avec « su root » les valeurs des variables sont :
LOGNAME = clement, PWD =clement, USER=clement.
Est-ce normal ?
Dans la documentation il y a marqué :

       •   efface toutes les variables d'environnement, à l'exception de TERM et des variables indiquées dans --whitelist-environment ;

       •   initialise les variables d'environnement HOME, SHELL, USER, LOGNAME et PATH ;

       •   se place dans le répertoire personnel de l'utilisateur cible ;

       •   définit argv[0] pour l’interpréteur de commandes à « - » pour faire de l’interpréteur de commandes un interpréteur de connexion.

La documentation dit ceci :
$ man su
3e paragraphe de DESCRIPTION :

For backward compatibility, su defaults to not change the current directory
and to only set the environment variables HOME and SHELL (plus USER and
LOGNAME if the target user is not root).

C’est donc normal, comme on pouvait s’y attendre.

A se demander si l’origine de la confusion ne vient d’une traduction approximative française de man su.
En français, lien html: ‹ su [options] [nom_utilisateur] ›
En anglais, pas la même chose.

NAME
su - run a command with substitute user and group ID

SYNOPSIS
su [options] [-] [user [argument…]]

DESCRIPTION
su allows commands to be run with a substitute user and group ID.

   When called with no user specified, su defaults to running an interactive shell as root. When user is
   specified, additional arguments can be supplied, in which case they are passed to the shell.

@clement2
Peux-tu vérifier ce que donnent les commandes suivantes dans ton environnement.

$ env | grep 'USER\|HOME\|LOGNAME\|SHELL\|^PATH'
USER=toto
HOME=/home/toto
LOGNAME=toto
SHELL=/usr/bin/zsh
PATH=/usr/bin:/bin:/usr/local/bin:/home/users/bin

Par défaut, l’utilisateur substitué par su est root.
su - root, ou plus simplement su -

# env | grep 'USER\|HOME\|LOGNAME\|SHELL\|^PATH'
USER=root
HOME=/root
LOGNAME=root
SHELL=/usr/bin/zsh
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin