Commande su : différence entre su et su -, sudo su et sudo -i, et comment changer de compte
Pour exécuter des commandes avec un autre compte sous Linux sans vous déconnecter du compte actuel, utilisez la commande su. En lançant su depuis le compte root d'un serveur AlmaLinux 9 vers daemon, un compte système qui ne peut pas se connecter, un seul tiret a changé le dossier de travail et le PATH, et il a fallu indiquer un shell pour que la commande s'exécute.
Les sorties ci-dessous proviennent d'un serveur AlmaLinux 9.8 (compte root) et d'un serveur Debian 12 (compte ordinaire). Les écrans qui demandent un mot de passe et sudo n'ont pas été exécutés sur un serveur en production et sont résumés d'après les manuels officiels ; une partie de la valeur de PATH et le numéro de version de correctif d'util-linux du simulateur ont été remplacés par des valeurs d'exemple.
1️⃣ Utiliser la commande su
La forme de base est [su nom_du_compte], et si vous omettez le nom du compte, su passe à root. Si vous tapez exit dans le nouveau shell, ce shell se termine et vous revenez au shell du compte d'origine qui a lancé su.
Lancé depuis un compte ordinaire, vous saisissez le mot de passe du compte cible à la ligne Password: (selon la configuration PAM par défaut). Sur ce serveur, /etc/pam.d/su saute l'authentification quand c'est root qui le lance, si bien qu'aucun mot de passe n'a été demandé pour passer du compte root à daemon.
su --help
Usage:
su [options] [-] [<user> [<argument>...]]
Change the effective user ID and group ID to that of <user>.
A mere - implies -l. If <user> is not given, root is assumed.
Options:
-m, -p, --preserve-environment do not reset environment variables
-w, --whitelist-environment <list> don't reset specified variables
-g, --group <group> specify the primary group
-G, --supp-group <group> specify a supplemental group
-, -l, --login make the shell a login shell
-c, --command <command> pass a single command to the shell with -c
--session-command <command> pass a single command to the shell with -c
and do not create a new session
-f, --fast pass -f to the shell (for csh or tcsh)
-s, --shell <shell> run <shell> if /etc/shells allows it
-P, --pty create a new pseudo-terminal
-h, --help display this help
-V, --version display version
For more details see su(1).Comme l'indique l'aide, le tiret [-] est l'option de connexion, identique à [-l], et les arguments écrits après le nom du compte sont transmis au shell du compte cible. Sur le serveur AlmaLinux 9, su provenait du paquet util-linux 2.37, et sur le serveur Debian 12, du paquet 2.38.
su --versionsu from util-linux 2.38.1Pour savoir si le compte vers lequel vous voulez passer peut ouvrir un shell, regardez le dernier champ de sa ligne dans getent passwd.
getent passwd daemondaemon:x:2:2:daemon:/sbin:/sbin/nologinLe shell de daemon était /sbin/nologin. Un compte qui a nologin à la place d'un shell de connexion n'ouvre pas de shell, même après être passé dessus avec su.
2️⃣ Différence entre su et su -
Avec un tiret (-), su ouvre le même shell que si vous vous connectiez avec le compte cible. Dans le dossier /tmp, la même commande a été lancée une fois sans tiret et une fois avec.
su -s /bin/sh -c pwd daemon/tmpsu - -s /bin/sh -c pwd daemon/usr/sbinSans tiret, le dossier de travail est resté /tmp, alors que [su -] est passé au dossier personnel de daemon, /sbin. Sur ce serveur, /sbin est un lien vers /usr/sbin, c'est pourquoi pwd a affiché /usr/sbin.
Pour les variables d'environnement, seules cinq lignes de la sortie d'env ont été comparées : HOME, USER, SHELL, PATH et LOGNAME.
su -s /bin/sh -c env daemon | grep -E '^(HOME|USER|SHELL|PATH|LOGNAME)='SHELL=/bin/sh
LOGNAME=daemon
HOME=/sbin
USER=daemon
PATH=/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binsu - -s /bin/sh -c env daemon | grep -E '^(HOME|USER|SHELL|PATH|LOGNAME)='SHELL=/bin/sh
LOGNAME=daemon
HOME=/sbin
USER=daemon
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbinHOME, USER et LOGNAME ont pris les valeurs de daemon dans les deux cas. Sans tiret, PATH a gardé la valeur de root, qui avait lancé su, et avec [su -] il a été redéfini selon la configuration de connexion.
D'après le manuel officiel, su sans tiret ne change que HOME et SHELL, et ne change aussi USER et LOGNAME que si le compte cible n'est pas root. Ainsi, si vous passez à root depuis un compte ordinaire sans tiret, USER garde le nom du compte d'origine.
[$0], qui affiche le nom du shell, était lui aussi différent.
su -s /bin/sh -c 'echo $0' daemonshsu - -s /bin/sh -c 'echo $0' daemon-shAvec [su -], un tiret a été ajouté devant le nom du shell et -sh s'est affiché. Un shell dont le nom commence par un tiret fonctionne comme shell de connexion et lit les fichiers de configuration de connexion (d'après le manuel officiel). Voici les différences entre les deux formes.
| Comparaison | su | su - |
|---|---|---|
| Dossier de travail | Inchangé (/tmp) | Dossier personnel du compte cible (/usr/sbin) |
| HOME, USER, LOGNAME | Valeur de daemon | Valeur de daemon |
| PATH | Valeur de root, qui a lancé su | Redéfini par la configuration de connexion |
| Nom du shell ($0) | sh | -sh (shell de connexion) |
| Autres variables d'environnement | Conservées | Effacées sauf quelques-unes comme TERM (d'après le manuel officiel) |
Le manuel officiel recommande d'ajouter toujours l'option de connexion pour que les environnements ne se mélangent pas, et d'écrire [--login] au lieu du tiret. su sans tiret conserve le dossier actuel et le PATH ; si vous voulez vérifier une commande avec la configuration d'un autre compte, le résultat peut donc différer de celui de [su -].
3️⃣ Options su -c et su -s
Pour exécuter une seule commande avec un autre compte sans ouvrir de shell, écrivez la commande après -c. Quand id a été lancé avec [su -c] sur le compte en nologin, un message de refus s'est affiché à la place du résultat de la commande.
su -c id daemonThis account is currently not available.Une commande passée avec -c est elle aussi reçue et exécutée par le shell du compte ; si ce shell est nologin, la commande n'est donc jamais atteinte. Dans ce cas, indiquez avec -s le shell à exécuter.
su -s /bin/sh -c id daemonuid=2(daemon) gid=2(daemon) groups=2(daemon)Avec /bin/sh, id s'est exécuté avec l'UID 2 de daemon. Utilisez cette forme pour vérifier des droits de fichiers ou le résultat de commandes avec un compte de service.
Si le shell du compte cible est un shell restreint absent de /etc/shells, comme nologin, seul root peut changer de shell avec -s. D'après le manuel officiel, -s et la variable SHELL indiqués par un utilisateur autre que root sont alors ignorés.
Si la commande après -c contient des espaces, entourez-la de guillemets pour la transmettre en un seul bloc. su renvoie tel quel le code de sortie de la commande exécutée, 126 si la commande n'a pas pu être exécutée et 127 si elle est introuvable (d'après le manuel officiel).
📌 Options principales : résultats de cet article
| Option | Rôle | Résultat dans cet article | |
|---|---|---|---|
| - | Ouvre le même shell qu'une connexion avec le compte cible et passe dans le dossier personnel de ce compte | Depuis /tmp, pwd donnait /tmp sans tiret et /usr/sbin avec, et echo $0 donnait -sh | |
| -c commande | Exécute une commande avec le shell du compte cible sans ouvrir de shell | su -c id daemon lancé sur le compte en nologin daemon a affiché [This account is currently not available.] | |
| -s shell | Exécute le shell indiqué au lieu de celui du compte ; pour les comptes à shell restreint, root uniquement | su -s /bin/sh -c id daemon a affiché uid=2(daemon) gid=2(daemon) groups=2(daemon) | |
| --help | Affiche l'utilisation et la liste des options | Ligne Usage et liste des options -m, -w, -g, -G, -l, -c, -f, -s, -P, -h, -V | |
| --version | Affiche les informations de version | su from util-linux 2.38.1 sur le serveur Debian 12 |
📎 Autres options : selon le manuel officiel
| Option | Rôle | |
|---|---|---|
| -l | Option de connexion identique au tiret (-) ; nom long --login | |
| -m | Conserve les variables d'environnement et ne change pas non plus HOME, SHELL, USER ni LOGNAME ; ignorée avec l'option de connexion (identique à -p) | |
| -w liste | Conserve les variables écrites avec des virgules quand l'option de connexion vide l'environnement ; HOME, SHELL, USER, LOGNAME et PATH sont redéfinis | |
| -g groupe | Indique le groupe principal ; root uniquement | |
| -G groupe | Indique des groupes supplémentaires ; root uniquement ; sans -g, le premier groupe supplémentaire devient le groupe principal | |
| -f | Transmet -f au shell ; option utilisée avec csh et tcsh | |
| -P | Crée un nouveau pseudo-terminal pour ne pas partager le terminal avec la session d'origine | |
| --session-command commande | Identique à -c mais sans créer de nouvelle session ; le manuel le déconseille |
🔲 Simulateur de la commande su
Le simulateur ci-dessous démarre avec le compte ordinaire user1, et vous pouvez essayer vous-même su, [su -] et sudo, puis revenir avec exit. Les comptes et les mots de passe sont des valeurs d'exemple.
4️⃣ Différence entre sudo su et sudo -i
sudo su lance su avec les droits root par l'intermédiaire de sudo. Comme c'est root qui lance su, le mot de passe root n'est pas demandé ; c'est sudo qui demande d'abord le mot de passe de la personne qui l'exécute (d'après la documentation officielle).
Les comptes autorisés à exécuter sudo sont définis par la configuration /etc/sudoers. Si un compte non autorisé exécute sudo, il est refusé avec [user1 is not in the sudoers file.] (d'après le message du programme).
Pour chaque commande qui ouvre un shell root, voici le mot de passe demandé et le dossier de travail. Les commandes de cette section n'ont pas été exécutées sur un serveur en production et sont résumées d'après les manuels su(1) et sudo(8).
| Commande | Mot de passe demandé | Shell lancé | Dossier de travail |
|---|---|---|---|
| su | root | Shell root | Inchangé |
| su - | root | Shell de connexion root | /root |
| sudo su | Compte qui l'a lancé | Shell root | Inchangé |
| sudo su - | Compte qui l'a lancé | Shell de connexion root | /root |
| sudo -i | Compte qui l'a lancé | Shell de connexion root | /root |
| sudo -s | Compte qui l'a lancé | Shell de la variable SHELL (droits root) | Inchangé |
[sudo -i] et [sudo su -] aboutissent tous deux à un shell de connexion root. Avec [sudo -i], sudo lance directement le shell de root comme shell de connexion, tandis que [sudo su -] repasse une fois par su entre les deux.
[sudo -s] lance le shell de la variable SHELL avec les droits root et ne passe pas dans le dossier personnel. Une fois le mot de passe saisi correctement, sudo ne le redemande pas dans le même terminal pendant 5 minutes par défaut (d'après le manuel de sudoers).
La différence entre su et sudo ressemble à celle entre emprunter la clé d'une maison et inscrire son nom à l'accueil pour entrer.
5️⃣ Erreurs de la commande su
Si vous passez à un compte qui ne peut pas se connecter, nologin s'exécute à la place d'un shell et [This account is currently not available.] s'affiche. En lançant [su daemon] depuis root, seule cette ligne s'est affichée, avec le code de sortie 1.
su daemonThis account is currently not available.Ce message est affiché par le programme nologin indiqué dans le dernier champ de la ligne du compte, et le même texte a été trouvé dans /usr/sbin/nologin sur le serveur. En root, vous pouvez indiquer un shell avec -s et exécuter des commandes avec ce compte.
Si le mot de passe est incorrect, [su: Authentication failure] s'affiche. Ce texte est le message que renvoie la bibliothèque PAM en cas d'échec d'authentification. D'après le manuel officiel, si su échoue avant d'exécuter la commande, le code de sortie est 1.
Si su refuse alors que vous avez bien saisi le mot de passe de votre compte, vérifiez d'abord si c'est le mot de passe du compte cible qui est demandé. sudo demande le mot de passe de la personne qui l'exécute, alors que su demande celui du compte vers lequel vous passez.
Si vous saisissez un nom de compte qui n'existe pas, [su: user user9 does not exist or the user entry does not contain all the required fields] s'affiche (d'après le message du programme). Voici la cause et les points à vérifier pour chaque erreur.
| Sortie | Cause | À vérifier |
|---|---|---|
| This account is currently not available. | Le shell du compte cible est nologin | Dernier champ de la ligne du compte dans getent passwd ; en root, indiquer un shell avec -s |
| su: Authentication failure | Mot de passe incorrect | S'il s'agit du mot de passe du compte cible (sudo demande le vôtre) |
| su: user user9 does not exist … | Aucun compte de ce nom | getent passwd nom_du_compte |
| user1 is not in the sudoers file. | Compte non autorisé à utiliser sudo | Configuration sudoers et groupe wheel |
🔢 FAQ & contenus recommandés
Droits · propriété
Permissions Linux (4,2,1) et propriété | commandes chmod, chown, umask
Un article sur la façon de vérifier et de modifier les droits de lecture, d'écriture et d'exécution ainsi que le propriétaire des fichiers et des répertoires.
Utilisateurs et accès
Commandes Linux who et w & commande user
Commandes pour voir quels utilisateurs sont connectés au serveur en ce moment et ce qu'ils exécutent.
Réseau et accès
Commande SSH : options et utilisation
Un article sur la forme de base et les options de la commande ssh, qui se connecte à un serveur distant avec un compte utilisateur.
ℹ️ Mention d'affiliation
Le contenu de ce site contient des liens d'affiliation. Lorsqu'un visiteur achète un produit ou un service via l'un de ces liens, le site perçoit une commission du vendeur. Le montant payé par l'acheteur(il baisse lors des promotions ↓), lui, n'augmente pas. Les prix, remises et stocks indiqués correspondent à la date de rédaction et peuvent différer ; vérifiez-les donc auprès du vendeur avant d'acheter. Les produits sont choisis et évalués selon nos propres critères, et les commissions n'influencent ni l'ordre de présentation ni le contenu des évaluations.