如何向 sudoers 添加 echo write 命令

如何向 sudoers 添加 echo write 命令

我想添加一个使用 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

相关内容