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: ALL
acceso otorgado en/etc/sudoers
.Cron está ejecutando y ejecutando el script. Agregar un simple
date > /tmp/log
produce 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
env
desde el script que se ejecuta muestra la$PATH
variable 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/log
al 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/log
al 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 test
devuelve 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-user
y el archivo sudoers es el valor predeterminado de distribución.
The user in question has (root) NOPASSWD: ALL access granted in /etc/sudoers
y mi cerebro comenzó a gritar demasiado fuerte para seguir leyendo.sudo
derechos 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/sudoers
archivo 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 !visiblepw
está activado / no comentado.