我制作了一个脚本,需要具有 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 以允许应该运行脚本的用户或组在没有密码的情况下运行这些命令。sixad
rfkill
答案2
您可以设置设定值标记脚本并将所有者设置为 root(或者更好的是,具有您所需权限的人)。 setuid 标志意味着当任何可以运行该脚本的人运行该脚本时,该进程的 UID 将设置为其所有者。
例如,您可以拥有一个脚本乔,setuid 标志打开,所以当爱丽丝运行它,脚本本身具有以下权限乔(就像乔运行它一样,即使他现在没有登录)。
IIUC 你想在 HTTP 服务器下运行它。我不确定这是否适用于所有服务器,但至少 Debian 上的 Apache 会拒绝运行 setuid 脚本。它将只允许二进制可执行文件。我通过用 C 创建一个简单的包装器来解决这个问题,该exec()
包装器将使用硬编码路径的脚本。
但是,我肯定会尝试避免以 root 身份运行任何东西远程:更安全的方法是创建一个特别的用户仅用于特定任务,没有比需要更多的权限,并使用上述技术。 (我不确定,但这可能意味着有关 Apache 的部分将不适用——它可能仅适用于 root 的脚本。)
基本上,分配权限的方式是使用户成为特定组的成员。许多发行版都会为您创建特定于设备的组(例如“cdrom”、“fax”...)。查看您的系统上是否有“蓝牙”组;如果有,创建一个新用户并使其成为该组的成员。