sudoers(5)
手册页说可以在 sudoers 文件的命令行参数中使用 shell 样式的通配符(又名元或全局字符)。它们是*
,?
,[...]
和[!...]
。
我的想法是在正则表达式样式中使用一些东西,例如/path/to/command -a[v]*
, 表示command -a
,command -av
并且command -avvv...v
在一行中(对于这种根据-v
参数数量改变其详细程度的命令,例如tcpdump
)。但它不起作用。
有没有办法做到这一点,而不是在每个中添加不同数量的/path/to/command -a -v
多次?sudoers
-v
从版本 1.9.10开始,这些sudoers
文件支持 POSIX 扩展正则表达式。根据手册,您可以通过以下方式实现您想要的:
/path/to/command ^-av*$
Run Code Online (Sandbox Code Playgroud)
在 1.9.10 之前的版本中,sudoers
手册页相当清楚地表明不支持此功能。手册页中的注释表明它使用系统的fnmatch()
函数来进行匹配。在基于 linux/glibc 的系统上,fnmatch()
可以使用扩展的通配符格式,其表达能力与正则表达式类似,但语法不同。
因此,如果您应该能够sudo
通过找到 sudo 调用 fnmatch 的位置来重建以支持扩展语法,请添加FNM_EXTMATCH
到 flags 参数以及#define _GNU_SOURCE
调用它的文件的顶部。
当然,如果您这样做,您将运行自己手动修补的 suid 二进制文件版本,因此请小心。