Допустим, у нас есть два пользователя: alex и alexa. Мы хотим разрешить alex выполняться htop
как root, чтобы видеть статистику использования диска, но мы не хотим, чтобы они видели процессы других пользователей, которые может делать root. Тогда необходимо разрешить им выполняться htop
с -u
флагом, являющимся их собственным именем пользователя(важное примечание: как отметил @HBruijn, указание флага пользователя htop
не мешает исполнителю изменять пользовательский фильтр с помощью клавиши U; давайте представим, что флаг ограничивает исполнителя, чтобы проиллюстрировать проблему). Но нам также нужно проверить, что последний указанный -u
аргумент — это alex
, плюс мы не хотим, чтобы он был последним указанным аргументом. Регулярное выражение выглядит следующим образом:
^.*(--user=alex|-u alex)\b((?!-u).)*$
^
указывает начало строки(--user=alex|-u alex)
- группа захвата для-u
параметра\b
- граница слова (поэтому Алекс не смог указать-u alexa
)((?!-u).)*
- отрицательный просмотр вперед, который запрещает любые проходы после того, как был пройден-u
допустимый ( )-u alex
И записываем это в /etc/sudoers
файл:
echo "alex ALL=(ALL) NOPASSWD: /usr/bin/htop ^.*(--user=alex|-u alex)\b((?!-u).)*$" >> /etc/sudoers
Однако когда alex пытается выполнить обычную команду, sudo отклоняет ее:
$ 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.
При проверке регулярного выражения egrep
(в документации sudo указано, что это похоже на проверку строк с помощью регулярного выражения) все работает так, как и ожидалось:
$ echo '-u alex' | egrep '^.*(--user=alex|-u alex)\b((?!-u).)*$'
-u alex
Что вызывает такое поведение sudo, игнорирующего это совпадение? Использую Ubuntu 22.04, Sudo 1.9.14p3.