假设我们有两个用户:alex 和 alexa。我们希望允许 alexhtop
以 root 身份执行,以便查看磁盘使用情况统计信息,但我们不希望他们看到 root 可以执行的其他用户的进程。那么就需要允许他们以自己的用户名作为标志htop
执行-u
(重要提示:正如@HBruijn 提到的,指定用户标志并htop
不能阻止执行器通过 U 键更改用户过滤器;让我们假装该标志确实限制了执行器来说明问题)。但我们还需要检查最后一个指定的-u
参数是否为alex
,而且我们不想强制它是最后一个指定的参数。正则表达式如下:
^.*(--user=alex|-u alex)\b((?!-u).)*$
^
表示字符串开始(--user=alex|-u alex)
-u
-参数的捕获组\b
- 单词边界(因此 alex 无法指定-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。