J'écris un petit programme utilitaire. Je voudrais qu'il essaie de sudo
lancer quelque chose si nécessaire.
C'est-à-dire: si les permissions de file ne permettent pas à l'user actuel d'opérer sur un file particulier (et les règles de sudo
le permettraient), je voudrais que mon utilitaire sudo
-run quelque chose en tant que propriétaire du file.
J'espère vérifier cette capacité avant, parce que je préférerais que les journaux système ne remplissent pas le bruit des tentatives infructueuses de sudo
. Comme sudo
lui-même rapporte sur l'échec: "Cet incident sera rapporté".
Donc, j'espère vérifier par programmation: l' user <x>
peut- user <x>
exécuter la command <y>
via sudo
?
Voici le problème: while /etc/sudoers
contient ce mappage, il appartient à la racine et n'est pas lisible par les users réguliers.
J'envisageais de générer un sous-process pour exécuter sudo -l
(qui génère des commands que l'user actuel peut exécuter). Je voudrais ensuite parsingr la sortie de cela. Cependant, cela semble un peu fragile. La sortie contient l'information que je veux, mais il semble qu'elle a été conçue pour les humains à lire (pas pour la consommation programmatique). Je ne sais pas s'il existe une garantie que la sortie suivra le même format à l'avenir, ou sur différentes plates-forms.
L'parsing programmatique de la sortie sudo -l
est-elle considérée comme sûre? Sinon, y a-t-il de meilleures options pour déterminer à l'avance si une command sudo aboutirait?
(en arrière-plan sur le X / Y: cet utilitaire est utilisé par un count de rôle à access limité.) J'attends que d'autres users optent pour permettre au count à access limité de fonctionner sur leurs files via des règles sudo. je ne sais pas à l'avance lequel de ces autres users a la règle sudo pertinente en place)
Selon la page man de sudo:
-l, --list If no command is specified, list the allowed (and forbidden) commands for the invoking user (or the user specified by the -U option) on the current host. A longer list format is used if this option is specified multiple times and the security policy supports a verbose output format. If a command is specified and is permitted by the security policy, the fully-qualified path to the command is displayed along with any command line arguments. If command is specified but not allowed, sudo will exit with a status value of 1.
donc cela se résume à
if sudo -l -U $USER shutdown > /dev/null then ## $USER can else ## $USER cannot fi
Comme indiqué par Muru, utilisez soit -U $USER
ou -U $USERTOTEST
ou rien, selon vos besoins.