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)

Respuestas:
Según la página de manual de sudo:
así que esto se reducirá a
Como ha señalado Muru, utilice uno
-U $USERo-U $USERTOTESTo nada, dependiendo de su necesidad.fuente
$USERreferirte al usuario actual, puedessudo -l <command>prescindir-U $USER.(targetUser) ALL, !/usr/bin/foo... en ese casosudo -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 lasudo -lsalida más detallada .