我有一个用户级应用程序,需要通过写入设备文件(需要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”传递给脚本以启用和禁用设备?
答案 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身份运行的守护程序,一边看着一个命名的管道,它(有效地)执行上面的操作,具体取决于管道中的内容。