Avec su
, vous devenez un autre utilisateur - root par défaut, mais potentiellement un autre utilisateur. Si vous dites su -
, votre environnement est également remplacé par l'environnement de connexion de cet utilisateur, de sorte qu'il est impossible de distinguer ce que vous voyez de la connexion en tant qu'utilisateur. Le système ne peut en aucun cas dire ce que vous faites su
à un autre utilisateur à partir des actions qu'il a effectuées lorsqu'il se connecte.
Les choses sont très différentes avec sudo
:
Les commandes que vous exécutez sudo
s'exécutent en tant qu'utilisateur cible - racine par défaut, mais -u
pouvant être modifiées - mais il enregistre les commandes que vous exécutez, en les étiquetant avec votre nom d'utilisateur afin que le blâme puisse être attribué ultérieurement. :)
sudo
est très flexible. Vous pouvez par exemple limiter les commandes qu'un utilisateur ou un groupe d'utilisateurs donné est autorisé à exécuter. Avec su
, c'est tout ou rien.
Cette fonctionnalité est généralement utilisée pour définir des rôles. Par exemple, vous pouvez définir un groupe de "sauvegardes" autorisé à s'exécuter dump
et ayant tar
chacun besoin d'un accès root pour sauvegarder correctement le disque système.
Je mentionne cela ici parce que cela signifie que vous pouvez donner à quelqu'un des sudo
privilèges sans lui donner sudo -s
ni sudo bash
capacités. Ils ne disposent que des autorisations nécessaires pour effectuer leur travail, alors su
qu'ils disposent de l'ensemble du système. Vous devez cependant faire attention à cela: si vous donnez à quelqu'un la possibilité de dire sudo vi
, par exemple, il peut se défaire de vi
et avoir effectivement le même pouvoir qu'avec sudo -s
.
Puisqu'il prend le mot de passe sudoer au lieu du mot de passe root, sudo
isole l'autorisation entre plusieurs sudoers.
Cela résout un problème administratif avec su
, qui est que lorsque le mot de passe root change, tous ceux qui devaient le connaître pour pouvoir utiliser su
devaient être prévenus. sudo
permet aux mots de passe des sudoers de changer indépendamment. En fait, il est courant de verrouiller par mot de passe le compte de l'utilisateur root sur un système sudo
pour forcer toutes les tâches sysadmin à être effectuées via sudo
. Dans une grande entreprise comptant de nombreux utilisateurs de confiance, cela signifie que lorsqu'un des administrateurs système quitte son poste, vous n'avez pas besoin de changer le mot de passe root et de le distribuer aux administrateurs qui restent.
La principale différence entre sudo bash
et sudo -s
est qu’elle -s
est plus courte et vous permet de transmettre des commandes à exécuter dans le shell par défaut de votre utilisateur de plusieurs manières:
Vous pouvez dire sudo -s some-command
qui court some-command
sous votre coquille. C'est essentiellement un raccourci pour sudo $SHELL -c some-command
.
Vous pouvez plutôt transmettre les commandes à l'entrée standard du shell, par exemple sudo -s < my-shell-script
. Vous pouvez utiliser cela avec un heredoc pour envoyer plusieurs commandes à un seul sudo
appel, évitant ainsi la nécessité de taper de manière sudo
répétée.
Ces deux comportements sont facultatifs. Beaucoup plus communément, vous donnez -s
seul, de sorte qu'il exécute simplement le shell de votre utilisateur de manière interactive. Dans ce mode, il diffère du sudo bash
fait qu'il peut exécuter un shell différent de celui utilisé bash
, car il apparaît d'abord dans la SHELL
variable d'environnement, puis s'il est non défini, au paramètre de shell de connexion de l'utilisateur, généralement défini dans /etc/passwd
.
Le shell exécuté sudo -s
hérite de votre environnement utilisateur actuel. Si ce que vous voulez réellement est un environnement propre, comme ce que vous obtenez juste après la connexion, vous souhaitez plutôt sudo -i
un ajout relativement récent sudo
. En gros, sudo -i
c’est sudo -s
comme cela su -
est su
: il réinitialise presque toutes les variables d’environnement clés et vous renvoie au répertoire de base de votre utilisateur. Si vous ne lui donnez pas également de commandes à exécuter sous ce shell via une entrée standard ou sudo -i some-command
, il l'exécutera comme un shell de connexion interactif, de sorte que les scripts de démarrage du shell de votre utilisateur (par exemple .bash_profile
) seront exécutés à nouveau.
Tout cela rend sudo -i
considérablement plus sûr que sudo -s
. Pourquoi? Parce que si quelqu'un peut modifier votre environnement auparavant sudo -s
, cela pourrait entraîner l'exécution de commandes imprévues. Le cas le plus évident est celui de la modification SHELL
, mais cela peut aussi arriver moins directement, comme via PAGER
si vous dites man foo
sous sudo -s
.
Vous pourriez dire: "S'ils peuvent modifier PAGER
, ils peuvent modifier PATH
, puis ils peuvent simplement remplacer un sudo
programme diabolique ", mais quelqu'un suffisamment paranoïaque peut dire /usr/bin/sudo /bin/bash
d'éviter ce piège. Vous n'êtes probablement pas si paranoïaque que vous évitez également les pièges de toutes les autres variables d'environnement sensibles, cependant. Avez-vous également pensé à vérifier EDITOR
, par exemple, avant d'exécuter une commande VCS ? Ainsi sudo -i
.
Etant donné sudo -i
que votre répertoire de travail est également remplacé par le répertoire de base de votre utilisateur, vous pouvez toujours l'utiliser sudo -s
pour les situations dans lesquelles vous savez que vous souhaitez rester dans le même répertoire que celui cd
dans lequel vous étiez auparavant sudo
. Il est toujours plus sûr de sudo -i
et cd
à l' endroit où vous étiez, cependant.
sudo su -
cette façon, vous n'avez pas besoin du mot de passe root et-
vous assurez que le répertoire personnel est défini correctement.