Nehmen wir an, wir haben zwei Benutzer: Alex und Alexa. Wir möchten Alex erlauben, htop
als Root ausgeführt zu werden, um Statistiken zur Festplattennutzung anzuzeigen, aber wir möchten nicht, dass er die Prozesse anderer Benutzer sieht, was Root tun kann. Dann müssen wir ihnen erlauben, htop
mit dem -u
Flag ihren eigenen Benutzernamen auszuführen.(Wichtiger Hinweis: Wie @HBruijn erwähnt hat, verhindert die Angabe des Benutzerflags htop
nicht, dass der Executor den Benutzerfilter mit der Taste U ändert. Um das Problem zu veranschaulichen, nehmen wir an, dass das Flag den Executor einschränkt.). Wir müssen aber auch prüfen, ob das letzte angegebene -u
Argument ist alex
, und wir wollen nicht erzwingen, dass es das letzte angegebene Argument ist. Der reguläre Ausdruck lautet wie folgt:
^.*(--user=alex|-u alex)\b((?!-u).)*$
^
gibt den Anfang der Zeichenkette an(--user=alex|-u alex)
- die Erfassungsgruppe für den-u
Parameter\b
- Wortgrenze (also konnte Alex sie nicht angeben-u alexa
)((?!-u).)*
- negativer Lookahead, der alle-u
Pässe verweigert, nachdem der gültige (-u alex
) passiert wurde
Und wir schreiben es in die /etc/sudoers
Datei:
echo "alex ALL=(ALL) NOPASSWD: /usr/bin/htop ^.*(--user=alex|-u alex)\b((?!-u).)*$" >> /etc/sudoers
Wenn Alex jedoch versucht, einen normalen Befehl auszuführen, verweigert sudo dies:
$ 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.
Beim Überprüfen von regulären Ausdrücken egrep
(in der Dokumentation von sudo heißt es, dass dies der Überprüfung von Zeichenfolgen anhand regulärer Ausdrücke ähnlich ist) funktioniert es wie erwartet:
$ echo '-u alex' | egrep '^.*(--user=alex|-u alex)\b((?!-u).)*$'
-u alex
Was verursacht dieses Verhalten, bei dem sudo diese Übereinstimmung ignoriert? Ich verwende Ubuntu 22.04, Sudo 1.9.14p3.