Commande su : différence entre su et su -, sudo su et sudo -i, et comment changer de compte

Environnement de testFamille RHELAlmaLinux 9.8util-linux 2.37Compte rootDebian 12 · util-linux 2.38 compte standardVérifié le 2026-11-05
Exécuter des commandes avec un autre 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

  • ↪️ Forme de base et retour avec exit

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 --version
su from util-linux 2.38.1

Pour 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 daemon
daemon:x:2:2:daemon:/sbin:/sbin/nologin

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

  • ↪️ Shell de connexion et variables d'environnement

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
/tmp
su - -s /bin/sh -c pwd daemon
/usr/sbin

Sans 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/bin
su - -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/sbin

HOME, 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' daemon
sh
su - -s /bin/sh -c 'echo $0' daemon
-sh

Avec [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.

Comparaisonsusu -
Dossier de travailInchangé (/tmp)Dossier personnel du compte cible (/usr/sbin)
HOME, USER, LOGNAMEValeur de daemonValeur de daemon
PATHValeur de root, qui a lancé suRedéfini par la configuration de connexion
Nom du shell ($0)sh-sh (shell de connexion)
Autres variables d'environnementConservéesEffacé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

  • ↪️ Exécuter une seule commande et choisir le shell

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 daemon
This 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 daemon
uid=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

OptionRôleRésultat dans cet article
-Ouvre le même shell qu'une connexion avec le compte cible et passe dans le dossier personnel de ce compteDepuis /tmp, pwd donnait /tmp sans tiret et /usr/sbin avec, et echo $0 donnait -sh
-c commandeExécute une commande avec le shell du compte cible sans ouvrir de shellsu -c id daemon lancé sur le compte en nologin daemon a affiché [This account is currently not available.]
-s shellExécute le shell indiqué au lieu de celui du compte ; pour les comptes à shell restreint, root uniquementsu -s /bin/sh -c id daemon a affiché uid=2(daemon) gid=2(daemon) groups=2(daemon)
--helpAffiche l'utilisation et la liste des optionsLigne Usage et liste des options -m, -w, -g, -G, -l, -c, -f, -s, -P, -h, -V
--versionAffiche les informations de versionsu from util-linux 2.38.1 sur le serveur Debian 12

📎 Autres options : selon le manuel officiel

OptionRôle
-lOption de connexion identique au tiret (-) ; nom long --login
-mConserve 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 listeConserve les variables écrites avec des virgules quand l'option de connexion vide l'environnement ; HOME, SHELL, USER, LOGNAME et PATH sont redéfinis
-g groupeIndique le groupe principal ; root uniquement
-G groupeIndique des groupes supplémentaires ; root uniquement ; sans -g, le premier groupe supplémentaire devient le groupe principal
-fTransmet -f au shell ; option utilisée avec csh et tcsh
-PCrée un nouveau pseudo-terminal pour ne pas partager le terminal avec la session d'origine
--session-command commandeIdentique à -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.

Simulateur de la commande suutil-linux 2.37
[user1@server1 ~]$
Fonctionne uniquement dans le navigateur ; les comptes et les mots de passe sont des valeurs d'exemple, et ↑↓ rappellent les commandes précédentes (les mots de passe ne restent pas dans l'historique).

4️⃣ Différence entre sudo su et sudo -i

  • ↪️ Mot de passe demandé et changement de dossier

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).

CommandeMot de passe demandéShell lancéDossier de travail
surootShell rootInchangé
su -rootShell de connexion root/root
sudo suCompte qui l'a lancéShell rootInchangé
sudo su -Compte qui l'a lancéShell de connexion root/root
sudo -iCompte qui l'a lancéShell de connexion root/root
sudo -sCompte 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

  • ↪️ This account is currently not available · Authentication failure

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 daemon
This 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.

SortieCauseÀ vérifier
This account is currently not available.Le shell du compte cible est nologinDernier champ de la ligne du compte dans getent passwd ; en root, indiquer un shell avec -s
su: Authentication failureMot de passe incorrectS'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 nomgetent passwd nom_du_compte
user1 is not in the sudoers file.Compte non autorisé à utiliser sudoConfiguration sudoers et groupe wheel

🔢 FAQ & contenus recommandés

Le manuel officiel présente su surtout comme une commande pour les utilisateurs ordinaires et recommande, pour les scripts exécutés par root, la commande runuser, qui ne passe pas par l'authentification. La forme est [runuser -u compte -- commande].

Si vous écrivez après -w (--whitelist-environment) les noms des variables à garder, séparés par des virgules, [su -] conserve ces variables quand il vide l'environnement. D'après le manuel officiel, HOME, SHELL, USER, LOGNAME et PATH sont redéfinis même s'ils figurent dans la liste.

D'après le manuel officiel, su enregistre toujours les tentatives de connexion échouées dans le fichier btmp et n'écrit pas dans le fichier lastlog. Consultez les entrées de btmp avec la commande lastb.

ℹ️ 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Prouvez que vous êtes humain : 0   +   9   =