¿Es posible verificar la capacidad de sudo antes de sudo'ing?

11

Estoy escribiendo un pequeño programa de utilidad. Me gustaría que intentara sudoejecutar algo si fuera necesario.

Es decir: si los permisos de archivo no permiten que el usuario actual opere en un archivo en particular (y las sudoreglas lo permitan), me gustaría que mi utilidad sudoejecute algo como el propietario del archivo.

Espero verificar esta capacidad de antemano, porque preferiría que los registros del sistema no se llenen de ruido por intentos sudofallidos. Como sudose informa en caso de falla: "Este incidente se informará".

Entonces, espero verificar programáticamente: ¿se puede user <x>ejecutar a command <y>través de sudo?

Aquí está el problema: si bien /etc/sudoerscontiene esa asignación, es propiedad de la raíz y no puede ser leída por los usuarios habituales.

Estaba considerando generar un subproceso para ejecutar sudo -l(que genera comandos que el usuario actual puede sudo-ejecutar). Luego analizaría el resultado de esto. Sin embargo, esto parece un poco frágil. El resultado contiene la información que quiero, pero parece que fue diseñado para que los humanos lo lean (no para consumo programático). No sé si hay alguna garantía de que la salida seguirá el mismo formato en el futuro, o en diferentes plataformas.

¿Se sudo -lconsidera seguro el análisis programático de la salida? Si no, ¿hay mejores opciones para determinar con anticipación si un comando sudo sería exitoso?


(antecedentes sobre X / Y: esta utilidad es para uso de una cuenta de rol de acceso limitado. Espero que otros usuarios opten efectivamente para permitir que la cuenta de acceso limitado opere en sus archivos a través de reglas de sudo. Sin embargo, gané no sepa de antemano cuál de esos otros usuarios tiene la regla de sudo relevante en su lugar)

Peter Martin
fuente
3
Te recomiendo que tomes un enfoque ligeramente diferente. En lugar de tener reglas por usuario, ¿por qué no tener un grupo al que se le permita hacer lo que usted quiera que haga? De esa manera, simplemente puede verificar si el usuario está en el grupo. ¿Sería una alternativa decente?
terdon

Respuestas:

13

Según la página de manual 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.

así que esto se reducirá a

if sudo -l -U $USER shutdown > /dev/null
then
   ## $USER can
else
   ## $USER cannot
fi 

Como ha señalado Muru, utilice uno -U $USERo -U $USERTOTESTo nada, dependiendo de su necesidad.

Archemar
fuente
Si pretendías $USERreferirte al usuario actual, puedes sudo -l <command>prescindir -U $USER.
muru
Gracias, esto es útil. Una cosa que noté al probar este enfoque es que no parece ocuparse de los casos en que la regla sudo se ha configurado para permitir TODOS los comandos con excepciones particulares, como (targetUser) ALL, !/usr/bin/foo ... en ese caso sudo -l -u targetUser /usr/bin/footodavía parece salir /usr/bin/fooy salir con estado 0. Aún así, es básicamente suficiente para mi simple verificación, y supera el análisis de la sudo -lsalida más detallada .
Peter Martin