我想添加一个使用 echo 将文件写入 sudoers 的命令,以便无需密码即可运行。
通常该命令会像这样:
sudo sh -c 'echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo'
(sh -c 在那里是因为直接在 sudo 上运行 echo 只会返回权限被拒绝)
通常,要使用户无需密码即可通过 sudo 运行命令,可以通过将以下内容添加到 sudoers 文件中来完成:
cestarian ALL = NOPASSWD: /bin/sh
然而,我自然不希望 sh 在没有密码的情况下可执行,因为我想这会很容易被利用,但我只是希望这个特定的命令能够工作......
cestarian ALL = NOPASSWD: /bin/sh -c 'echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo'
这不起作用,我知道 sudoers 应该能够接受带有特定参数的命令,但在这种情况下它不起作用,我不知道为什么。
我想要一种让它发挥作用的方法。
答案1
sudo
当用作命令的参数时,不会特别对待'
和。"
如果您用来sudo -ll
列出 sudo 已解析的内容,您可以看到这一点。对于你的例子,它会说
/bin/sh -c 'echo 1 > /sys/...'
它期待真实的引号,因此它会匹配,例如,
sudo sh -c "'echo 1 > /sys/...'"
您可以做的是删除 sudoers 文件中的引号并使用反斜杠转义空格:
cestarian ALL = NOPASSWD: /bin/sh -c echo\ 1\ >\ /sys/...
答案2
看起来sudo
包含引号或空格的参数存在问题。可能有一种语法上正确的方法来处理这个问题,但最简单的解决方案是将 shell 命令移动到单独的文件中。例如,/usr/local/bin/enable_no_turbo
使用以下内容创建:
#!/bin/sh
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
使其可执行:
chmod 755 /usr/local/bin/enable-no-turbo
并在您的中启用它sudoers
:
cestarian ALL = NOPASSWD: /usr/local/bin/enable-no-turbo
如果您想要更通用的解决方案,请/usr/local/bin/write-to-file
使用以下内容进行创建:
#!/bin/sh
echo "$2" > "$1"
在你的sudoers
:
cestarian ALL = NOPASSWD: /usr/local/bin/write-to-file /sys/devices/system/cpu/intel_pstate/no_turbo 1
这将允许:
sudo write-to-file /sys/devices/system/cpu/intel_pstate/no_turbo 1
但不允许以下任何一种情况:
sudo write-to-file /sys/devices/system/cpu/intel_pstate/no_turbo 0
sudo write-to-file /some/other/file 1
ETC。
答案3
另一种方法是允许tee
此类文件进入sudoers
username ALL = NOPASSWD: /bin/tee sys/devices/system/cpu/intel_pstate/no_turbo
然后使用| sudo tee
而不是>
echo 1 | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo