Pourquoi "sudo -u root echo` whoami` "ne retourne pas root?

11

Comment utilisez-vous sudo pour exécuter une commande en tant qu'utilisateur root réel sur Ubuntu? Je pensais à l'origine que c'était le comportement par défaut de sudo, jusqu'à ce que je lance:

myuser@localhost:~$ sudo echo `whoami`
myuser

myuser@localhost:~$ sudo -u root echo `whoami`
myuser

Cependant, c'est le type de comportement que je veux, mais uniquement sur une seule ligne:

myuser@localhost:~$ sudo su -
root@localhost:~# echo `whoami`
root
Cerin
la source
11
pourquoi faire écho whoami? Dites simplement sudo whoami .. retourne root
Neo

Réponses:

26

En fait , il ne les exécuter en tant que root. Mais, ce qui vous arrive, c'est que les ticks arrière sont évalués avant les sudo exécutions, car ils sont nécessaires pour évaluer la commande. Plus directement, pourquoi pas seulement:

sudo whoami

Vos whoamiticks en arrière sont en fait évalués dans un sous-shell en tant qu'utilisateur actuel, c'est pourquoi vous voyez ce que vous faites.

Erreur fatale
la source
2
C'est faux. sudo s'exécute avec les privilèges root mais pas en tant que root.
Manfred Moser
@Moser, alors pourquoi sa commande affiche-t-elle "root"?
Cerin
4
@ManfredMoser: Il fonctionne avec l'UID de 0(zéro), qui est exactement ce que les gens appellent "root". (Vous auriez eu raison si vous aviez sudoétendu ses capacités sans vraiment changer l'UID. Mais ce n'est pas ce qu'il fait.)
user1686
1
M. Moser a peut -être fait valoir que set-UID ne changeait que l' ID utilisateur effectif du processus, exigeant que le processus lui-même se charge ensuite de changer l'ID utilisateur réel, comme c'est le sudocas. Mais à la lecture de la réponse xyr, cela ne semble pas avoir été le cas.
JdeBP
7

Le sous-shell ( whoami) est exécuté en premier, comme vous, et le résultat ( myuser) est placé dans la sudocommande; ce qui sudovoit est echo myuser. Considérez-le comme un raccourci pour:

tmpvar=`whoami`
sudo echo "$tmpvar"
Kevin
la source
1

Il semble y avoir des conjectures ici…

Les backticks font évidemment ce que les autres ont expliqué, se développant whoamiavant d'invoquer «sudo», et laissant les backticks désactivés retournent «root», comme prévu.

Mais il est utile de comprendre ce qui se passe réellement avec sudo (8). J'ai donc regardé la page de manuel!

"Les uid et gid réels et efficaces sont définis pour correspondre à ceux de l'utilisateur cible…"

Il apparaît donc que le comportement observé n'a rien à voir avec la différence entre l'ID utilisateur effectif et réel.

Il est également illustratif de faire "sudo printenv" et de comparer simplement "printenv", ce qui m'a en fait un peu surpris. Il montre que [i] certaines [/ i] variables exportées sont disponibles et d'autres ne le sont pas: il signale HOME, PATH, PS1, SHELL, TERM et EDITOR de l'utilisateur appelant, mais pas d'autres comme MANPATH, CVSROOT, LD_LIBRARY_PATH ou ENV. Cela semble un peu étrange, car cela pourrait entraîner un comportement différent des programmes qu'ils ne le font en tant qu'utilisateur d'origine ou en tant que root.

Jan Steinman
la source
0

sudo vous permet d'exécuter n'importe quelle commande avec des privilèges root, mais pas en tant qu'utilisateur root. La raison pour laquelle cela est utile est qu'avec cette configuration, plusieurs personnes peuvent avoir des droits root mais toute la journalisation et ainsi de suite indique toujours qui a effectué les modifications.

Cette configuration est meilleure que le partage de mots de passe root. En tant que tel, il a remplacé les utilisateurs root sur de nombreuses distributions, y compris Ubuntu.

sudo su en revanche fait de vous les utilisateurs root et ne devrait donc pas vraiment être utilisé.

Cette différence explique également votre comportement observé (correct).

Manfred Moser
la source
6
Non. Ce qui explique le comportement est très simple: comment fonctionne la substitution de commandes dans le shell. Cela n'a rien à voir avec les privilèges.
JdeBP
-2

Sudo accorde temporairement qui que vous soyez (étant donné que vous êtes autorisé à sudo en premier lieu) des privilèges de niveau racine.

Pour être root, vous devez vous connecter en tant que root qui est bloqué par défaut dans Ubuntu.

Vous devez être prudent avec cela, sudo n'est pas root. Si vous voulez montrer que Fred exécute quelque chose en tant que sudo, che3d les variables d'environnement SUDO, SUDO_COMMAND pourrait être le plus utile.

Tony Hopkinson
la source
La racine est bloquée dans Ubuntu? Êtes-vous sûr de cela? Je sais que c'est découragé, mais je pensais qu'ils rendaient la tâche un peu plus difficile pour un novice en définissant en fait un mot de passe obscur à l'aide d'un UUID, qui peut être modifié à l'aide des méthodes habituelles.
Marty Fried