我想允许服务用户通过对话框脚本搜索文件,但通过 sudoers 锁定 find 命令,因此只允许一个包含正则表达式的命令。
sudoers 中应该允许使用这个确切的命令,而不是其他命令(我特别担心 find 的 -delete 和 -exec 功能)
operator ALL=NOPASSWD:/bin/find / -type f -regex ".*/core.[0-9]*$"
但看起来 sudoers glob 与正则表达式模式混乱。我已经尝试转义正则表达式模式,但 sudo 总是要求我输入密码。
对于 root 用户来说,将整个“锁定”移至脚本中并允许 sudo 仅以写访问权限运行脚本并不是一个选项,因为我们通过 SVN 例程更新此对话框脚本,这将使部署过程变得复杂。
答案1
您使用正则表达式作为 的标志参数find
,因此即使sudoers
不支持正则表达式,仅支持类似 shell 通配符的通配符(请参阅手册页)因此,您所尝试的方法在概念上似乎是合理的。
至少对于 GNU bash 4.x 及更高版本,-regex 默认模式的语法是 EMACS 正则表达式语法。可能存在细微的差异(我必须研究才能知道),比如说,您可能更熟悉的东西,例如sed
、awk
或grep
实用程序正则表达式的语法...
如果您使用 RHEL,请仔细检查您的文档对此,因为事情可能略有不同......
在任何情况下,您始终可以指定,例如:
operator ALL=NOPASSWD: /usr/bin/find -type f -regextype grep -regex ".*core\.[0-9]*$"
...表示任何常规文件从当前目录向下,以一个或多个任意字符开头,后跟字符串“core.”,以一个或多个数字结尾。
再说一遍,这是你想要的吗?
如果不,用简单的英语说明你希望你的正则表达式做什么,或者只是给出一些你想要捕获的重要示例,所以我可以将其翻译为适当的 GNU 风格的 grep 风格的正则表达式。
温馨提示:
- 要
sudoers
在不同平台上使用相同的规则,我建议您系统地指定要应用的正则表达式语法类型,如上所示。 - 在 的上下文中
sudoers
,我始终会指定您要执行搜索的路径。使用该-path
标志,后跟要搜索的子树最顶层的绝对路径。
=====================
总而言之,出于可读性和安全原因,在处理 时sudoers
,我通常建议为您的find
cmd 编写一个最小的包装脚本,例如名为findcore.sh
、由 拥有root:root
、权限为 751 的脚本,它不接受任何参数(通过使用""
)。
operator ALL=NOPASSWD: /path/to/findcore.sh ""
然后,您可以通过 SVN 或其他无需密码的机制轻松更新脚本的内容sudo
,方法是在文件中包含第二条规则sudoers
,专门用于通过您喜欢的机制执行的更新。
华泰