使用 root 权限运行用户脚本

使用 root 权限运行用户脚本

我制作了一个脚本,需要具有 root 权限才能启用和禁用蓝牙功能。我将其绑定到一个按钮,因此以 root 身份登录来运行脚本是不可行的。如何正确设置脚本的文件权限?我知道最好的做法是只有 root 才能编辑和读取该文件,但如何授予它完整的执行权限?

BT_RFKILL=$(rfkill list | grep tpacpi_bluetooth_sw | sed 's/\([0-9]\+\):.*/\1/')
BT_STATE=$(rfkill list $BT_RFKILL | grep "Soft blocked: yes")

if [ "x" == "x$BT_STATE" ]; then
    sixad --stop
    sleep 2s
    rfkill block $BT_RFKILL
else
    rfkill unblock $BT_RFKILL
    sleep 2s
    sixad --start
fi
exit 0

如果我使用 sudo ,该脚本可以完美运行,但这并不理想,因为我喜欢通过简单的键绑定来运行它。

答案1

安全的方法可能是在调用和sudo的脚本行上使用(我假设两者都需要 root 权限)。然后配置 sudoers 以允许应该运行脚本的用户或组在没有密码的情况下运行这些命令。sixadrfkill

答案2

您可以设置设定值标记脚本并将所有者设置为 root(或者更好的是,具有您所需权限的人)。 setuid 标志意味着当任何可以运行该脚本的人运行该脚本时,该进程的 UID 将设置为其所有者。

例如,您可以拥有一个脚本,setuid 标志打开,所以当爱丽丝运行它,脚本本身具有以下权限(就像乔运行它一样,即使他现在没有登录)。

IIUC 你想在 HTTP 服务器下运行它。我不确定这是否适用于所有服务器,但至少 Debian 上的 Apache 会拒绝运行 setuid 脚本。它将只允许二进制可执行文件。我通过用 C 创建一个简单的包装器来解决这个问题,该exec()包装器将使用硬编码路径的脚本。

但是,我肯定会尝试避免以 root 身份运行任何东西远程:更安全的方法是创建一个特别的用户仅用于特定任务,没有比需要更多的权限,并使用上述技术。 (我不确定,但这可能意味着有关 Apache 的部分将不适用——它可能仅适用于 root 的脚本。)

基本上,分配权限的方式是使用户成为特定组的成员。许多发行版都会为您创建特定于设备的组(例如“cdrom”、“fax”...)。查看您的系统上是否有“蓝牙”组;如果有,创建一个新用户并使其成为该组的成员。

相关内容