- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在编写 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 权限。
另一个我非常喜欢的解决方案(因为不必将用户添加到 sudoers)是将程序的所有者更改为 root,并设置 setuid
位。 (这是我从 here 学到的)。
但是,有件事我想知道。我想做的是在程序的 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, "971\n");
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: %d\n", 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 文件中读取呢?
最佳答案
我还没有用 /sysfs
尝试过,但即使是普通文件,我的理解是文件 streams 在调用 后不会保留访问权限setuid()
。但是,由于我不明白的原因,文件句柄 确实如此。因此,如果您的系统行为与我的相同(x64 上的 Fedora 20),您可以使用 open()
/read()
而不是 fopen()
/fscanf()
。
关于c - 以 root 身份打开文件,但在读取文件之前放弃权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45960961/
我用 Flash 创建全屏交互式演示,最近一直在寻求迁移到新语言。我的 Flash 演示基本上是软件原型(prototype),在浏览器之外的投影仪 EXE 中运行。我想离开 Flash 有多种原因,
偶尔,对于转瞬即逝的时刻,我认为 auto_ptr 很酷。但大多数时候,我认识到有更简单的技术可以让它变得无关紧要。例如,如果我想自动释放一个对象,即使抛出异常,我也可以新建该对象并分配给一个 aut
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
Microsoft 于 2024 年 8 月 30 日[1]宣布推出 ASP.NET Core OData 9 包。 这个新包将ASP.NET Core与.NET 8 OData库保持一致,改变了OD
放弃当前在 Mercurial topic 中不需要的变更集的最佳方法是什么,这些变更集已经被推送并且不能被剥离? 换句话说,是否可以从 hg topics 输出中删除主题而不发布它? 最佳答案 hg
在过去几天沮丧地尝试将我的代码重构为最佳设计模式,即显示模块模式,或者甚至只是满足于简单的命名空间之后,我得出的结论是,对我来说,一个优雅的设计模式被破坏 visual studio intellis
我有一个构造 auto_ptr 的类并获得 T由效用函数填充的对象数据。但是,我想要 T由对象管理器存储的对象,该对象将在应用程序的整个生命周期内持续存在。 问题是 - 一旦我提取了 auto_ptr
在 C/C++ 中是否有可能“放弃”线程的 CPU 时间?例如: void wait(int s) //Low cpu usage { int tmp = time(); while(tmp +
概览:我创建了一个具有客户区域和管理区域的系统。这两个区域都有不同的登录页面。用户可以在管理区域以用户 A 身份登录,同时在客户区域以 用户 B 身份登录。 当用户从客户或管理区域注销时,调用 Ses
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
[temp.spec]/6通过 P0692R1 的实现添加到 C++20 (特化访问检查)[ 重点 矿]: [temp.spec]/6 The usual access checking rules
因此,情况是我使用 SB 队列来限制对其他服务的传出回调。回拨其他服务的标准问题之一是它们可能会出现无法控制的停机时间。假设我检测到目标已关闭/没有响应,放弃该消息以使其不会立即重新出现在队列中的最佳
我有一个使用MVVM模式的WPF应用程序,其中ViewModel调用执行所有保存/更新/获取/删除内容的查询。我这样做是因为,例如,修改查询以交换存储系统很容易。 如果即时存储/删除数据,但该应用程序
很抱歉,如果这个问题很愚蠢或已得到解答,但我在任何地方都找不到是或否。 在我们的生产 Oracle 环境中,是否可以删除架构 SCOTT? 我知道它是一个示例架构,但我们的安全部门希望删除任何未使用的
如果我将所有文件(图像、样式表、JavaScript、图标...)与 index.html 文件一起直接放入元素文件夹;不使用子文件夹来构建我的文件,例如图像、CSS...这会带来性能优势吗? 当然。
所以我有一个相当老的应用程序,最后一次在 iPhone X(s) 发布之前使用。始终使用启动图像源而不是启动屏幕文件,如下所示。 我现在在 iPhone X 上启动时遇到问题,因为屏幕尺寸是从 Lau
我有一个 Canvas 比手机屏幕大的绘图应用程序。我想实现用两根手指滚动并用一根手指绘图。到目前为止,我可以使滚动工作得很好,但是当涉及到绘图时,线条开始,然后绘图所在的 View 失去了对触摸的控
是否可以放弃对 iPhone 3GS 对新 App 的支持?因为我正在从 iPad 游戏移植到 iPhone。 480*320分辨率太小了。很难将我当前的游戏移植到它上面。但是高分辨率的 iPhone
我有一个 Python 应用程序,它在单独的线程中运行作业。一些 workerjobs 为数据库连接实现 pymongo。 class Job(Thread): ... self.
我有一个提交到启动脚本的 PHP 页面的 HTML 表单。该脚本可能需要 3 秒到 30 秒的时间才能运行 - 用户无需在附近即可完成该脚本。 是否可以启动一个 PHP 脚本,立即向用户打印“谢谢”(
我是一名优秀的程序员,十分优秀!