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 option1
pero no command option2
usar:
user_name ALL=(root) /usr/bin/command option1
pero si la estructura es command option1 value1
, donde value1
puede 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 pmset
puede 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 sudoers
archivo 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/program
fuera un script de Python?