Généralités système Linux

Différences sudo, su et su -

Table des matières

root



Introduction



Dans cet article, on va expliquer les différences entre la commande sudo et su, avec la différence de syntaxe pour cette dernière.

Je pourrai ainsi rediriger les personnes sur cet article qui me questionnent souvent sur ce sujet.

Dans le cas de la commande sudo, on n'abordera pas la partie configuration.
Pour cela, se référer à l'article https://www.linuxtricks.fr/wiki/sudo-utiliser-et-parametrer-sudoers

Commande sudo



La commande sudo (pour substute user do) permet à un utilisateur autorisé, de lancer une commande en tant que superutilisateur ou un autre utilisateur, selon la configuration.
Elle est souvent utilisée pour exécuter des commandes spécifiques nécessitant des privilèges root.

Lorsque la commande sudo est invoquée, elle demande le mot de passe de l'utilisateur actuellement connecté et non pas celui du superutilisateur. En gros, il s'agit d'une commande qui délègue des droits spécifiques à un utilisateur du système. C'est pour cela que sudo est paramétrable avec le fichier sudoers.
Ces actions déléguées sont historisées dans les journaux système.
A noter que par défaut, le mot de passe n'est pas redemandé pendant une période de 5 minutes.

La syntaxe de la commande sudo est la suivante :

Code BASH :
sudo -u util1 macmd


Le compte actuellement connecté va exécuter la commande macmd en tant qu'utilisateur util1 dans l'exemple.
En l'absence de l'option -u, la commande sera exécutée en tant que superutilisateur root comme dans l'exemple suivant :

Code BASH :
sudo macmd


La commande sudo ne charge l'environnement complet de l'utilisateur cible. Donc attention si on a des variables d'environnement spécifiques ou modifiées telles que $PATH.


Si le paramétrage le permet, il est possible d'ouvrir un shell avec les droits de l'utilisateur mentionné (ou root par défaut) ainsi que tout son environnement utilisateur (variables, profil, alias, ...) :

Code BASH :
sudo -u util1 -i


Dans le cas de la connexion avec l'option -i de sudo, l'environnement complet de l'utilisateur cible est chargé, y compris les scripts de connexion.

L'option -s ne fait que lancer en shell de l'utilisateur spécifié et ne charge l'environnement complet de l'utilisateur cible !

Commande su - et su



La commande su (pour switch user ou substitute user) est utilisé pour changer d'utilisateur, c'est à dire se connecter en tant qu'un autre utilisateur.

Lorsque la commande est invoquée, elle demande le mot de passe de l'utilisateur spécifié. Il n'y a pas de configuration particulière puisqu'il ne s'agit pas d'une délégation de droits. Par conséquent, il est nécessaire de connaitre le mot de passe du compte avec lequel on doit se connecter.
Seule l'action de connexion est historisée dans les journaux système.

La syntaxe de la commande su est la suivante :

Code BASH :
su - util1


La syntaxe su - a la même utilité que su -l ou su --login, c'est juste qu'elle est plus couramment utilisé, car simplement plus courte.
Le tiret a son importance afin de réaliser une connexion complète en tant qu'utilisateur mentionné. Lorsqu'on parle de connexion complète, cela signifie que l'environnement complet de l'utilisateur cible est chargé, y compris les scripts de connexion.

En l'absence d'un login, la connexion se fera en tant que root comme dans l'exemple suivant :

Code BASH :
su -



La commande su peut être utilisée sans l'option - (ou -l ou --login) :

Code BASH :
su util1


Cependant, dans ce cas, on notera que la connexion en tant qu'utilisateur spécifié est réalisée mais l'environnement de l'utilisateur n'est pas chargé complètement (variables, profil, alias, ...)

En l'absence d'un login, la connexion se fera en tant que root comme dans l'exemple suivant et comme vu précédemment, l'environnement n'est pas chargé complètement :

Code BASH :
su


Tester les différences



La commande env permet de voir les variables d'environnement utilisables d'environnement en cours d'exécution.

Pour bien cerner les différences entre toutes les commandes, depuis un utilisateur du système différent de root, on peut regarder les comportements suivants.

Dans les différents cas de démonstration ci-dessous, je suis connecté en utilisateur adrien
Je me connecte en tant que root

Cas 1 : su -



Code BASH :
cd /
su -
env > /tmp/env_root.txt


On notera l'environnement de l'utilisateur root complètement chargé.
On est bien dans le dossier personnel de root.


Cas 2 : su



Code BASH :
cd /
su
env > /tmp/env_su_sans_tiret.txt


On peut faire la différence avec la commande diff :
Code BASH :
diff -u /tmp/env_root.txt /tmp/env_su_sans_tiret.txt


On notera l'environnement de l'utilisateur root n'est pas complètement chargé.

Les variables PATH, MAIL sont celles de l'utilisateur adrien.
Je suis resté dans la racine et n'ai pas été positionné dans le dossier personnel de root


Cas 3 : sudo commande



Code BASH :
cd /
sudo env > /tmp/sudo_cmd_env.txt


On peut regarder les variables d'environnement avec :

Code BASH :
cat /tmp/sudo_cmd_env.txt


On notera qu'il y a beaucoup moins de variables définies.
La variable PATH est minimaliste.
Des variables SUDO supplémentaires sont présentes donnant des infos sur la commande lancée, et l'utilisateur qui a exécuté depuis sudo la commande :
Code :
SUDO_COMMAND=/bin/env
SUDO_USER=adrien
SUDO_UID=1000
SUDO_GID=1000



Cas 4 : sudo -i



Code BASH :
cd /
sudo -i
env > /tmp/env_sudo_i.txt


On peut faire la différence avec la commande diff :
Code BASH :
diff -u /tmp/env_root.txt /tmp/env_sudo_i.txt


On notera l'environnement de l'utilisateur root est complètement chargé.

La variable PATH dans mon exemple par rapport à la connexion avec su - est la même à l'exception du chemin /usr/local/bin qui n'est pas présent.
On est bien dans le dossier personnel de root.
On a les variables SUDO supplémentaires :

Code :
SUDO_COMMAND=/bin/bash
SUDO_USER=adrien
SUDO_UID=1000



Cas 5 : sudo -s



Code BASH :
cd /
sudo -s
env > /tmp/env_sudo_s.txt


On peut faire la différence avec la commande diff :
Code BASH :
diff -u /tmp/env_root.txt /tmp/env_sudo_s.txt


On notera l'environnement de l'utilisateur root n'est complètement chargé.

La variable MAIL est celle de l'utilisateur adrien.
La variable PATH est minimaliste.
Je suis resté dans la racine et n'ai pas été positionné dans le dossier personnel de root

On a les variables SUDO supplémentaires :

Code :
SUDO_COMMAND=/bin/bash
SUDO_USER=adrien
SUDO_UID=1000


A propos de sudo su



Parfois on voit la commande suivante :

Code BASH :
sudo su

ou
Code BASH :
sudo su -


Elle est parfois utilisée quand nous n'avons que le mot de passe utilisateur à notre disposition, afin d'ouvrir un shell en tant que root.
Cette commande demande d'exécuter la commande "su" (switch user) avec "sudo" (substitute/switch user do).

Comme nous l'avons vu :
- su permet de changer d'utilisateur (se connecter en tant qu'utilisateur)
- sudo permet de lancer une commande avec une délégation de droits

Utiliser sudo su est redondant et peut être évité en utilisant simplement la commande sudo directement.
sudo -i est à préférer à sudo su -
sudo -s est à préférer à sudo su

Cela fonctionne, je ne dis pas le contraire, mais nous pouvons tout faire avec la commande sudo et l'appel à "su" n'est pas réellement utile.

Pour comprendre la réflexion, je vous fais une analogie avec un cas de la vie courante :
Imaginez, que la connexion en root est l'action de rentrer dans votre appartement. Vous avez 2 portes à franchir : celle de l'immeuble et celle de votre appartement. Vous avez une même clé qui ouvre l'entrée de l'immeuble et votre appartement.
- sudo -i : Vous prenez votre clé, vous ouvrez la porte de l'immeuble, et avec cette clé vous ouvrez ensuite celle de votre appartement
- sudo su - : Vous appelez votre voisin qu'il ouvre avec sa clé la porte de l'immeuble, et avec votre clé vous ouvrez celle de votre appartement

Dans les 2 cas ça marche, mais la seconde option est illogique.
Cette page a été vue 18629 fois