我在 sudoers 语法方面遇到了一些麻烦。长话短说,我正在与我的显卡作斗争,最近我发现我可以用一个简单的命令打开和关闭它(以前它总是关闭的,这在 90% 的情况下都很好,但有时我会有时喜欢使用它的额外力量)。我的想法是在各种脚本中使用这两个命令来打开GC,执行使用GC的命令,然后将其关闭,如下所示:
sudo tee /proc/acpi/bbswitch <<<ON
optirun [command]
sudo tee /proc/acpi/bbswitch <<<OFF
问题是,这些脚本很少在 shell 中执行,它们大多是通过双击 .sh 文件来执行的。因此,我研究了如何避免特定sudo
命令的密码,并发现了sudoers
.
我执行visudo
并在文件末尾添加了一行:
grb ALL=(ALL) NOPASSWD: tee /proc/acpi/bbswitch <<<OFF, tee /proc/acpi/bbswitch <<<ON
但一旦我关闭编辑器,visudo
就说有语法错误,但仅此而已。即使我只添加一个命令,也会引发语法错误:
grb ALL=(ALL) NOPASSWD: tee /proc/acpi/bbswitch <<<OFF
此行是最后添加的,这是我第一次编辑该sudoers
文件。
如果有用的话,我正在使用 Ubuntu MATE 18.04。我怀疑答案确实很简单,但我找不到任何适合我的案例的文档。我想强调的是,我需要将可能的输入限制为/proc/acpi/bbswitch
ON 和 OFF,我不知道如果我写一些不同的东西会发生什么,并且从我的 GC 给我带来的麻烦来看,这可能会很糟糕。我必须知道,如果要求输入密码或程序无法启动,我必须检查开关命令是否正确编写。
答案1
重定向不是实际命令的一部分。它只是向 shell 发出的指令,以某种方式安排标准输入和输出的管道前实际运行命令。
<<<
因此,在文件的命令中包含“here-string”重定向是没有意义的sudoers
。
相反,因为您想限制使用仅有的允许将字符串ON
orOFF
写入/proc/acpi/bbswitch
,您可以制作如下脚本:
#!/bin/sh
case $1 in
ON) ;; # nothing
OFF) ;; # nothing here either
*) printf 'Usage: %s ON|OFF\n' "$0" >&2
exit 1
esac
printf '%s\n' "$1" >/proc/acpi/bbswitch
ON
然后,您可以将其放在所需用户可以访问它但不能修改它的目录中,并允许他们通过或OFF
命令行参数使用它,例如
grb ALL=(ALL) NOPASSWD: /some/path/script.sh ON, /some/path/script.sh OFF
(或类似的东西)