Estoy escribiendo un pequeño programa de utilidad. Me gustaría que intentara sudo
ejecutar 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 sudo
reglas lo permitan), me gustaría que mi utilidad sudo
ejecute 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 sudo
fallidos. Como sudo
se 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/sudoers
contiene 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 -l
considera 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 $USER
o-U $USERTOTEST
o nada, dependiendo de su necesidad.fuente
$USER
referirte al usuario actual, puedessudo -l <command>
prescindir-U $USER
.(targetUser) ALL, !/usr/bin/foo
... en ese casosudo -l -u targetUser /usr/bin/foo
todavía parece salir/usr/bin/foo
y salir con estado 0. Aún así, es básicamente suficiente para mi simple verificación, y supera el análisis de lasudo -l
salida más detallada .