Tengo un script ejecutado desde un crontab de usuarios sin privilegios que invoca algunos comandos usando sudo. Excepto que no. El script funciona bien pero los comandos sudo'ed fallan en silencio.
El script se ejecuta perfectamente desde un shell como el usuario en cuestión.
Sudo no requiere una contraseña. El usuario en cuestión tiene
(root) NOPASSWD: ALLacceso otorgado en/etc/sudoers.Cron está ejecutando y ejecutando el script. Agregar un simple
date > /tmp/logproduce resultados en el momento adecuado.No es un problema de permisos. Una vez más, el script se ejecuta, pero no los comandos sudo'ed.
No es un problema de ruta. La ejecución
envdesde el script que se ejecuta muestra la$PATHvariable correcta que incluye la ruta a sudo. Ejecutarlo usando una ruta completa no ayuda. El comando que se ejecuta recibe el nombre completo de la ruta.Intentar capturar la salida del comando sudo, incluido STDERR, no muestra nada útil. Agregar
sudo echo test 2>&1 > /tmp/logal script produce un registro en blanco.El binario sudo se ejecuta bien y reconoce que tiene permisos incluso cuando se ejecuta desde cron dentro del script. Agregar
sudo -l > /tmp/logal script produce el resultado:El usuario ec2-user puede ejecutar los siguientes comandos en este host:
(root) NOPASSWD: ALL
El examen del código de salida del comando usando $?muestra que está devolviendo un error (código de salida:) 1, pero no parece producirse ningún error. Un comando tan simple como /usr/bin/sudo /bin/echo testdevuelve el mismo código de error.
¿Qué más podría estar pasando?
Esta es una máquina virtual creada recientemente que ejecuta la última AMI de Amazon Linux. El crontab pertenece al usuario ec2-usery el archivo sudoers es el valor predeterminado de distribución.

The user in question has (root) NOPASSWD: ALL access granted in /etc/sudoersy mi cerebro comenzó a gritar demasiado fuerte para seguir leyendo.sudoderechos restringidos / solo / para los comandos que necesita en el script y deshabilitar por completo su capacidad de inicio de sesión.Respuestas:
Sudo tiene algunas opciones especiales en su archivo de permisos, una de las cuales permite una restricción en su uso a shells que se ejecutan dentro de un TTY, que cron no lo es.
Algunas distribuciones, incluida la AMI de Amazon Linux, tienen esto habilitado de forma predeterminada. El
/etc/sudoersarchivo se verá así:Si hubiera capturado la salida a STDERR en el nivel del script de shell en lugar del comando sudo en sí, le habría parecido un mensaje como este:
La solución es permitir que sudo se ejecute en entornos que no sean TTY eliminando o comentando estas opciones:
fuente
Defaults !visiblepwestá activado / no comentado.