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 :
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