TL; DR
我正在写一个C程序。 我需要root权限来fopen一个sysfs文件,我仍然需要root权限才能读取它。 但是,由于我的程序需要不断的读取sysfs文件,这就意味着它需要一直提高权限。 我想尽快删除root权限。 接受这个问题的方法是什么?
细节
我正在写一个与sysfs交互的程序。 如果我在shell上运行命令,我会使用:
myuser@mymachine:~$ sudo su root@mymachine:/home/myhomedir# cd /sys/class/gpio root@mymachine:/sys/class/gpio# echo 971 > export root@mymachine:/sys/class/gpio# cat gpio971/value 0 root@mymachine:/sys/class/gpio# exit
我需要在一个非特权用户可以调用的C程序中运行这些命令。 一种方法是使用fopen , fprintf , fscanf等以通常的方式编写程序,让用户通过sudo运行程序。 但是,这意味着用户需要成为一个sudoer,并且程序将始终具有root权限。
另一个我非常喜欢的解决scheme(因为用户不必被添加到sudoers)是将程序的所有者改为root,并设置setuid位。 (我从这里学到了 )。
如何使Windows Timer在后台线程中运行
pipe理私人堆
如何在Windows控制台中禁用回声?
不过,我想知道的东西。 我想要做的是在程序的euid为0时打开sysfs文件,然后立即删除所有权限(为了安全)。 然后,现在文件已经打开,我们只需setuid()到用户的UID。 但是,虽然我不能完全确定,但这是行不通的。 这是我的代码的相关部分:
//At this point,due to the file permissions on the executable,//euid = 0 and ruid = 1000. I kNow the following 4 lines work. FILE *export = fopen("/sys/class/gpio/export","wb"); fprintf(export,"971n"); fclose(export); FILE *sw_gpio = fopen("/sys/class/gpio971/value","rb"); setuid(1000); //Now euid = 1000 and ruid = 1000 int switch_val = -1; fscanf(sw_gpio,"%d",&switch_val); printf("Switch value: %dn",switch_val); //-1 //Even though the only possible values in this sysfs file are 0 and 1,//switch_val is still equal to -1 fclose(sw_gpio);
所以看来我需要保持提升的权限才能够从/sys/class/gpio/gpio971/value读取。 但是这正是我不想要的! 这个程序需要在整个程序执行过程中轮询值,而且我不需要root权限。
最后为了完成,这里是我在我的可执行文件上设置的权限:
-rwsr-xr-x 1 root myuser 10943 Jan 1 20:17 main*
那么,如何删除root权限,但是继续从访问控制的sysfs文件中读取?
如何为Win32构build谷歌的C ++ libphonenumber库
Linux和Windows上的printf
C ++ SNMP扩展代理 – 如何使用AsnSequence?
为什么gcc 4.9(中继线)这么慢?
仅用于消息循环的WPF窗口句柄
我还没有尝试过/sysfs ,但即使使用纯文件,我的理解是文件流在setuid()调用后不保留访问权限。 文件句柄 ,但是,因为我不明白的原因。 所以,如果你的系统像我的一样(在x64上的Fedora 20),你可以使用open() / read()而不是fopen() / fscanf() 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。