J'ai un programme qui devrait se comporter différemment s'il est exécuté sous "sudo". Existe-t-il un moyen de savoir s'il a été exécuté sous sudo?
Mise à jour: quelqu'un a demandé pourquoi je voudrais faire cela. Dans ce cas, sur un Mac utilisant MacPorts, une sortie vous indique de couper-coller une commande particulière. Si la commande MacPorts a été exécutée avec "sudo", elle doit inclure sudo dans l'exemple de commande:
$ sudo port selfupdate
---> Updating MacPorts base sources using rsync
MacPorts base version 2.2.1 installed,
MacPorts base version 2.2.1 downloaded.
---> Updating the ports tree
---> MacPorts base is already the latest version
The ports tree has been updated. To upgrade your installed ports, you should run
port upgrade outdated
^^^^^^^^^ it would be really sweet if it output "sudo port upgrade outdated" instead. It would be even better if it just did it for you :-)
Réponses:
Oui, 4 variables d'environnement sont définies lorsqu'un programme s'exécute sous sudo:
Notez que ceux-ci peuvent être truqués simplement en les réglant. Ne leur faites pas confiance pour quoi que ce soit de critique.
Par exemple: Dans ce programme, nous devons dire à l'utilisateur d'exécuter un autre programme. Si celui en cours a été exécuté avec sudo, l'autre le sera aussi.
Notez qu'il ne teste une variable SUDO_ * que s'il peut d'abord prouver qu'elle s'exécute en tant que root. Même alors, il ne l'utilise que pour modifier du texte utile.
la source
Cela ne répond pas directement à la question, mais je ne pense pas que la bonne question soit posée ici. Il me semble que le demandeur veut un programme qui agira vraisemblablement différemment s'il a certaines autorisations ou non, mais je dirais que la vérification de sudo n'est pas la façon de le faire. Premièrement, de nombreux systèmes peuvent ne pas implémenter un "sudo", ce n'est en aucun cas requis sous Linux ou de nombreux Unix.
Par exemple, un utilisateur peut déjà être connecté en tant que root, ce qui rend le sudo absurde ou peut-être que le système a des utilisateurs non root qui ont toujours les capacités d'effectuer la tâche administrative que le programme peut souhaiter effectuer. Enfin, peut-être que le système n'a pas de racine ou de sudo du tout et utilise à la place un système de contrôle d'accès obligatoire avec différentes capacités et aucun catch superutilisateur vers sudo. Ou l'utilisateur peut être créé, mais dans un compte qui a des autorisations -less- que son propre compte pour des raisons de sécurité (je lance souvent du code non approuvé avec un utilisateur temporaire non privilégié qui ne peut écrire sur des disques virtuels que pour supprimer, pas augmenter mes autorisations ). C'est globalement une mauvaise idée de supposer un modèle d'autorisations spécifique comme sudo ou l'existence de root ou de supposer qu'un utilisateur sudoed a des privilèges particuliers.
Si vous voulez savoir si vous avez les autorisations pour effectuer une opération, le meilleur moyen est généralement de simplement essayer de le faire, puis de vérifier errno pour les problèmes d'autorisations s'il échoue ou s'il s'agit d'une opération en plusieurs étapes qui doit soit échouer, soit réussir. vous pouvez vérifier si une opération fonctionnera avec des fonctions comme la fonction d' accès POSIX (méfiez-vous des conditions de concurrence possibles ici si les autorisations sont activement modifiées)
Si en plus vous avez besoin de connaître l'utilisateur réel derrière le sudo, vous pouvez utiliser la fonction getlogin qui devrait fonctionner pour toute session interactive avec un terminal sous-jacent et vous permettrait par exemple de trouver qui exécute `` réellement '' la commande pour l'audit ou de trouver le répertoire personnel de l'utilisateur réel pour enregistrer les journaux.
Enfin, si ce que vous voulez vraiment, c'est de savoir si un utilisateur a un accès root (toujours une mauvaise idée mais moins spécifique à l'implémentation), vous pouvez utiliser getuid pour vérifier un uid de 0 et donc root.
la source
Il existe deux mécanismes qui peuvent être utilisés.
growisofs
n'aime pas fonctionner sous SUDO, donc je désactive les variables SUDO dans les scripts où je l'utilise. Il peut être truqué dans l'autre sens. (La variable SUDO est également transportée dans l'environnement pour les scripts exécutés sous les commandes at et batch.)Il est plus courant de vérifier si vous utilisez en tant qu'utilisateur approprié. La
id
commande peut être utilisée pour ce faire. Le script de TomOnTime utilise laid
commande pour déterminer s'ilsudo
peut être nécessaire d'exécuter la commande suivante.la source
sudo
binaire en quelque chose d'autre? Ou nommer un autre exécutablesudo
pour simuler le contraire? Non pas que je m'attendrais vraiment à ce que quelqu'un d'esprit fasse ça ...root
accès pour renommer l'sudo
exécutable. Un utilisateur normal ne serait pas en mesure de le faire. J'ai noté que vous pouvez simuler que vous courez soussudo
. Renommer un programme existant fonctionnerait. Le code requis pour un fauxsudo
programme dédié est trivial.Vous pouvez comparer l'ID utilisateur effectif et réel.
Cela ne signifie pas strictement qu'il exécute undo sudo (pourrait également être défini), mais indique que le programme a plus de droits que l'utilisateur ne peut en attendre. (par exemple dans un programme qui est normalement exécuté sans ces droits, mais qui doit être exécuté avec eux lors de l'installation ou pour installer les mises à jour. Ensuite, vous pouvez l'utiliser pour donner des commentaires d'avertissement à ce sujet).
la source
sudo
définit à la fois l'id effectif et réel. Par opposition à suid, qui ne fonctionne pas. Voici un programme C trivial que vous pouvez utiliser pour tester (désolé, le commentaire supprimera les nouvelles lignes, vous devrez les rajouter):#include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() { printf("real = %i, effective = %i\n", getuid(), geteuid()); return 0; }
perl -E 'say $<, "\n", $>'
Vous pouvez vérifier la variable UID (EUID) effective, comme suit:
la source
sudo echo $USER
imprime le nom d'utilisateur non privilégié (la variable est remplacée AVANT le sudo). En fait, j'ai fini par utiliser votre code dans mon script. Merci!Vous pouvez toucher un fichier
/root
, puisif -e
le. Et si -e est vrai,rm
(vérification du code d'erreur), votre test fonctionnera la prochaine fois.La vérification du code d'erreur (ou du code retour) après la RM empêche quelqu'un d'utiliser facilement les pouvoirs sudo pour créer le fichier pour jouer une farce sur vous.
la source
/root
(ce qui n'est pas nécessairement la même chose que l'exécution de l'UID 0), mais ne vérifie pas s'il a obtenu ces autorisations en utilisantsudo
.J'ai trouvé que cela fonctionne bien pour cela
la source