0

我有一个用户级应用程序,需要通过写入设备文件(需要 root 权限)来启用/禁用设备。

这是我的接口的当前实现:

bool DeviceInterface::EnableDevice( bool isEnabled )
{
    bool isSuccessful = false;

    //enable device
    if(isEnabled)
    {
        isSuccessful = (system("enableDevice.sh 1") == 0)? true : false;
    }
    //disable device
    else
    {
        isSuccessful = (system("enableDevice.sh 0") == 0)? true : false;
    }
    return isSuccessful ;
}

我的脚本“enableDevice.sh”看起来像这样,并且在以 root 身份运行时运行良好:

echo $1 > /sys/devices/device_file

这会失败,因为它需要 root 权限才能写入设备文件。我对“pipes”、“fork”和“exec”完全陌生。谁能帮助我如何将“0”或“1”传递给脚本以启用和禁用设备?

4

2 回答 2

1

按如下方式在 enableDevice.sh 上运行 chmod(作为 root):-

   #chmod 4755 enableDevice.sh

这称为设置 setuid 位。有了这个非root用户将能够运行这个脚本,它将以所有者(在我们的例子中为root)的权限运行。这样你的程序就可以工作了。请阅读有关 setuid 的信息。编辑:另外,在 chmod 之前,将 enableDevice.sh 的所有者和组设为 root。然后只有它会起作用。

于 2012-05-10T07:27:10.897 回答
1

为了让“enableDevice.sh”执行此操作,它需要以 root 身份运行。您可以将其标记为 suid (chmod u+S enableDevice.sh) 并将其设置为 root。请注意,您需要成为 root 才能执行 chown(在任何合理的 unix 系统上)。

当然,您总是可以为您的(好吧,程序的)组或每个人打开写权限,即 chmod g+w,o+w /sys/devices/device_file

真的不建议你这样做。如果我用 '\"bunch of nothing > /dev/sda' 调用该脚本,它会覆盖系统驱动器的(可能)根目录。

一个更好的主意是让脚本检查“$1”是什么,然后将 0 或 1 回显到设备,或者如果两者都不是,则不执行任何操作。即不要相信用户数据,尤其是在 suid 脚本中!

case "$1" in
    enable)   VALUE=1 ;;
    disable)  VALUE=0 ;;
    *)        exit  ;;
esac
echo $VALUE > /sys/devices/device_file

更好的是,有一个你以 root 身份运行的守护进程,看着一个命名管道(有效地)执行上述操作,具体取决于它在管道中获得的内容。

于 2012-05-10T07:27:34.560 回答