![Sudo:如何从 sudo 中排除一个特定的命令行参数](https://linux22.com/image/778710/Sudo%EF%BC%9A%E5%A6%82%E4%BD%95%E4%BB%8E%20sudo%20%E4%B8%AD%E6%8E%92%E9%99%A4%E4%B8%80%E4%B8%AA%E7%89%B9%E5%AE%9A%E7%9A%84%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0.png)
我们希望将一个命令(例如:mycommand)添加到 sudo 中供所有用户使用,但我们希望排除一个特定的命令行选项 -i。复杂的因素是命令行参数可以组合,这使得构建正则表达式等变得更加困难。因此,我们希望允许:
- sudo 我的命令
- sudo mycommand -p -f 某事 -w
- sudo mycommand -pf 某事 -w
但不是:
- sudo 我的命令-我
- sudo mycommand -p -我-f 某物-w
- sudo mycommand -p我f 某物-w
到目前为止,我得到了不同的结果,例如错误地允许“sudo mycommand -piw”或错误地阻止“sudo mycommand -pf someth我ng-w”
除了编写包装脚本之外,还有其他建议吗?
答案1
可以使用 sudoers 文件中的模式排除命令行选项。但是,这很容易出错,因此包装脚本通常是更好的方法。
如果您使用的是 sudo 1.9.10 或更高版本,则可以在 sudoers 文件中使用正则表达式,它允许您执行以下操作:
someuser ALL = /usr/bin/swlist, !/usr/bin/swlist ^.*-i.*$
这将拒绝任何包含“-i”的命令行参数。但是,如果命令支持复合选项,则不会捕获以下内容:
$ sudo swlist -pi -f something -w
在那种(可能)情况下,您将需要类似以下内容:
someuser ALL = /usr/bin/swlist, !/usr/bin/swlist ^.*-[^[:space:]]*i.*$
旧版本的 sudo 仅支持 shell 样式的通配符模式,这些模式功能有限并且不支持您想要执行的操作。