如何使我的用户级应用程序通过管道与根级别应用程序进行通信?

时间:2012-05-10 07:01:08

标签: c++ linux pipe fork

我有一个用户级应用程序,需要通过写入设备文件(需要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权限才能写入设备文件。我对“管道”,“叉子”和“执行器”都很陌生。任何人都可以帮助我如何将“0”或“1”传递给脚本以启用和禁用设备?

2 个答案:

答案 0 :(得分:1)

在enableDevice.sh上运行chmod,如下所示(作为root): -

   #chmod 4755 enableDevice.sh

它被称为设置setuid位。使用此非root用户将能够运行此脚本,它将与所有者(在我们的情况下:root)权限一起运行。 因此,您的计划将有效。 请阅读有关setuid的内容。 编辑:此外,在chmod之前,将enableDevice.sh的所有者和组作为root。然后它才会起作用。

答案 1 :(得分:1)

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

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

真的不建议你这样做。如果我用'\'一堆什么都没有调用那个脚本> / dev / sda'它会覆盖系统驱动器的(可能的)根目录。

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

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

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

相关问题