Lo siguiente es para el caso en el que desea ejecutar un comando sin contraseña solo si tiene un conjunto específico de opciones, donde una parte de las opciones es variable . AFAIK no es posible usar variables o rangos de valores en las declaraciones de sudoers, es decir, puede permitir el acceso explícito a, command option1pero no command option2usar:
user_name ALL=(root) /usr/bin/command option1
pero si la estructura es command option1 value1, donde value1puede variar, necesitaría tener líneas sudoers explícitas para cada valor posible de value1. El script de Shell proporciona una forma de evitarlo.
Esta respuesta fue inspirada por la respuesta de M. Ahmad Zafar y soluciona el problema de seguridad allí.
- Cree un script de shell donde llame al comando sin
sudo.
- Guarde el script en una carpeta con privilegios de root (por ejemplo
/usr/local/bin/), haga que el archivo sea propiedad de root (por ejemplo chown root:wheel /usr/local/bin/script_name) sin acceso de escritura para otros (por ejemplo chmod 755 /usr/local/bin/script_name).
Agregue la excepción a los sudoers usando visudo:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.
Ejecutar la secuencia de comandos sudo script_name.
Por ejemplo, quiero cambiar el tiempo de espera de la pantalla en macOS. Esto se hace usando:
sudo pmset displaysleep time_in_minutes
Considero que cambiar el tiempo de espera del sueño es una acción inocente que no justifica la molestia de escribir una contraseña, pero pmsetpuede hacer muchas cosas y me gustaría mantener estas otras cosas detrás de la contraseña de sudo.
Entonces tengo el siguiente script en /usr/local/bin/ds:
#!/bin/bash
if [ $# -eq 0 ]; then
echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
pmset displaysleep $1
else
echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
fi
fi
Al final del sudoersarchivo tengo la siguiente línea:
user_name ALL=(root) NOPASSWD: /usr/local/bin/ds
Para establecer el tiempo de espera en 3 minutos, ejecuto mi script desde la cuenta de usuario normal user_name:
sudo ds 3
PD La mayor parte de mi script es validación de entrada, que no es obligatoria, por lo que lo siguiente también funcionaría:
#!/bin/bash
pmset displaysleep $1
/path/to/my/programfuera un script de Python?