Différences sudo, su et su -
Table des matières
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
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 :
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 :
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, ...) :
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.
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 :
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 :
La commande su peut être utilisée sans l'option - (ou -l ou --login) :
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 :
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
On notera l'environnement de l'utilisateur root complètement chargé.
On est bien dans le dossier personnel de root.
On peut faire la différence avec la commande diff :
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
On peut regarder les variables d'environnement avec :
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 :
On peut faire la différence avec la commande diff :
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 :
On peut faire la différence avec la commande diff :
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 :
Parfois on voit la commande suivante :
ou
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.
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.
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.