Digamos que tenemos dos usuarios: alex y alexa. Queremos permitir que Alex se ejecute htop
como root para ver las estadísticas de uso del disco, pero no queremos que vean los procesos de otros usuarios que el root puede hacer. Luego es necesario permitirles ejecutar htop
con la -u
bandera como su propio nombre de usuario.(nota importante: como mencionó @HBruijn, especificar el indicador de usuario htop
no impide que el ejecutor cambie el filtro de usuario mediante la tecla U; supongamos que el indicador limita al ejecutor para ilustrar el problema). Pero también debemos verificar que el último -u
argumento especificado sea alex
, además no queremos forzar que sea el último argumento especificado. La expresión regular viene de la siguiente manera:
^.*(--user=alex|-u alex)\b((?!-u).)*$
^
indica el inicio de la cadena(--user=alex|-u alex)
- el grupo de captura para el-u
parámetro\b
- límite de palabra (por lo que alex no pudo especificar-u alexa
)((?!-u).)*
- anticipación negativa que niega cualquier pase después de que se haya pasado-u
el válido ( )-u alex
Y lo escribimos en el /etc/sudoers
archivo:
echo "alex ALL=(ALL) NOPASSWD: /usr/bin/htop ^.*(--user=alex|-u alex)\b((?!-u).)*$" >> /etc/sudoers
Sin embargo, cuando Alex intenta ejecutar un comando normal, sudo se lo niega:
$ sudo /usr/bin/htop -u alex
[sudo] password for alex:
Sorry, user alex is not allowed to execute '/usr/bin/htop -u alex' as root on machine.
Al verificar la expresión regular egrep
(la documentación de Sudo indica que es similar a cómo valida cadenas a través de la expresión regular), funciona como se esperaba:
$ echo '-u alex' | egrep '^.*(--user=alex|-u alex)\b((?!-u).)*$'
-u alex
¿Qué causa este comportamiento de sudo ignorando esa coincidencia? Usando Ubuntu 22.04, Sudo 1.9.14p3.