Digamos que temos dois usuários: Alex e Alexa. Queremos permitir que alex seja executado htop
como root para ver as estatísticas de uso do disco, mas não queremos que eles vejam os processos de outros usuários que o root pode fazer. Então é necessário permitir que eles executem htop
com o -u
sinalizador sendo seu próprio nome de usuário(nota importante: como @HBruijn mencionou, especificar o sinalizador do usuário htop
não impede que o executor altere o filtro do usuário pela tecla U; vamos fingir que o sinalizador limita o executor para ilustrar o problema). Mas também precisamos verificar se o último -u
argumento especificado é alex
, além de não querermos forçá-lo a ser o último argumento especificado. O regexp vem da seguinte forma:
^.*(--user=alex|-u alex)\b((?!-u).)*$
^
indica o início da string(--user=alex|-u alex)
- o grupo de captura para o-u
parâmetro\b
- limite da palavra (então Alex não pôde especificar-u alexa
)((?!-u).)*
- lookahead negativo que nega qualquer-u
passagem após a válida (-u alex
) ter sido passada
E nós escrevemos no /etc/sudoers
arquivo:
echo "alex ALL=(ALL) NOPASSWD: /usr/bin/htop ^.*(--user=alex|-u alex)\b((?!-u).)*$" >> /etc/sudoers
No entanto, quando Alex tenta executar um comando normal, sudo os nega:
$ 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.
Ao verificar o regexp por meio egrep
(a documentação do sudo afirma que é semelhante à forma como valida strings por meio do regexp), ele funciona conforme o esperado:
$ echo '-u alex' | egrep '^.*(--user=alex|-u alex)\b((?!-u).)*$'
-u alex
O que causa esse comportamento do sudo ignorando essa correspondência? Usando Ubuntu 22.04, Sudo 1.9.14p3.