一般情况
我试图让用户无需密码即可运行 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