在 sudoers 中指定带引号参数的命令?

在 sudoers 中指定带引号参数的命令?

一般情况

我试图让用户无需密码即可运行 sudo 命令(带参数)。我可以让NOPASSWD指令起作用,但前提是参数不包含引号。

例如,这有效:

# /etc/sudoers.d/sample
%sudo   ALL=(ALL)  NOPASSWD: /bin/echo foo

$ sudo echo foo
foo

但事实并非如此,因为引号是按字面解释的:

# /etc/sudoers.d/sample
%sudo   ALL=(ALL)  NOPASSWD: /bin/echo "foo"

$ sudo echo "foo"
[sudo] password for rlue:
$ sudo echo \"foo\"
"foo"

我的具体案例

这是我试图允许的命令:

$ sudo sh -c 'echo XHCI > /proc/acpi/wakeup'

我实际上让它与以下未引用的命令一起使用:

%sudo   ALL=(ALL)  NOPASSWD: /bin/sh -c echo XHCI > /proc/acpi/wakeup

但既然它呼唤sh -c,并且因为我清楚地不明白到底发生了什么,我想更加明确地说明我所允许的内容。

如何在 sudoers 文件中指定命令参数的引用?

答案1

编辑:警告,sudo 似乎不能安全地处理命令中的空格,因此以这种方式使用 sudo 是不安全的。 https://unix.stackexchange.com/a/279142/39281

您可以使用反斜杠转义空格,而不是在 sudoers 文件中使用引号:

%sudo   ALL=(ALL)  NOPASSWD: /bin/sh -c echo\ XHCI\ >\ /proc/acpi/wakeup

您仍然可以按如下方式使用它,因为用户的 shell 无论如何都会处理引用的参数:

sudo /bin/sh -c 'echo XHCI > /proc/acpi/wakeup'

您还可以考虑将复杂的命令放入脚本中,如评论中所建议的那样。 https://serverfault.com/a/516002

相关内容