J'écris un petit programme utilitaire. Je voudrais qu'il essaie de sudo
lancer quelque chose si nécessaire.
C'est-à-dire: si les autorisations de fichier ne permettent pas à l'utilisateur actuel d'opérer sur un fichier particulier (et que les sudo
règles le permettent), j'aimerais que mon utilitaire sudo
exécute quelque chose en tant que propriétaire du fichier.
J'espère vérifier cette capacité à l'avance, car je préférerais que les journaux système ne se remplissent pas de bruit provenant d'échecs sudo
. Comme l' sudo
indique lui-même l'échec: "Cet incident sera signalé".
Donc, j'espère vérifier par programme: peut user <x>
fonctionner command <y>
via sudo
?.
Voici le problème: tandis que /etc/sudoers
contient ce mappage, il appartient à root et n'est pas lisible par les utilisateurs réguliers.
J'envisageais de créer un sous-processus à exécuter sudo -l
(qui génère des commandes que l'utilisateur actuel peut exécuter sudo). Je voudrais ensuite analyser la sortie de cela. Cependant, cela semble un peu fragile. La sortie contient les informations que je veux, mais il semble qu'elle ait été conçue pour être lue par les humains (pas pour la consommation programmatique). Je ne sais pas s'il y a une garantie que la sortie suivra le même format à l'avenir, ou sur différentes plates-formes.
L'analyse syntaxique des sudo -l
sorties est-elle considérée comme sûre? Sinon, existe-t-il de meilleures options pour déterminer à l'avance si une commande sudo réussira?
(Contexte sur le X / Y: cet utilitaire est destiné à être utilisé par un compte de rôle à accès limité. Je m'attends à ce que d'autres utilisateurs optent effectivement pour permettre au compte à accès limité de fonctionner sur leurs fichiers via les règles sudo. ne sais pas à l'avance lesquels de ces autres utilisateurs ont la règle sudo pertinente en place)
Réponses:
Selon la page de manuel sudo:
donc cela se résumera à
Comme l' a souligné Muru, utilisez
-U $USER
ou-U $USERTOTEST
ou rien, en fonction de vos besoins.la source
$USER
dire l'utilisateur actuel, vous pouvez simplement voussudo -l <command>
en passer-U $USER
.(targetUser) ALL, !/usr/bin/foo
.. dans ce cas,sudo -l -u targetUser /usr/bin/foo
il semble toujours sortir/usr/bin/foo
et quitter avec le statut 0. Pourtant, c'est fondamentalement suffisant pour ma simple vérification et bat l'analyse de lasudo -l
sortie la plus verbeuse .