我有一些使用的代码sched_setscheduler
从sched.h
sched_param sched;
sched.sched_priority = 70;
sched_setscheduler(getpid(), SCHED_FIFO, &sched);
但是,除非我使用sudo
.我不想以root
特权运行该应用程序。
有没有办法让我在不授予完全 root 权限的情况下授予用户或进程对此功能的访问权限?
- 编辑 -
德罗伯特给了一个很好的答案关于使用能力。在 中postinst
,我简单地添加:
setcap cap_sys_nice+ep /path/to/myapp
这里的问题是:
bin$ ./myapp
./myapp error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory
$LD_LIBRARY_PATH
该程序失去了从或(在我的例子中)指向的其他库动态加载库的能力rpath
。这似乎是预期行为。有没有解决的办法?
在进行任何动态加载之前,我尝试过setcap cap_setpcap+ep myapp
使用prctl(PR_CAPBSET_DROP, CAP_SETPCAP);
,但这似乎没有帮助。
答案1
改变你的调度程序和优先级应该只需要这个CAP_SYS_NICE
能力;看到sched(7) 的权限和资源限制。您可能还想查看联机帮助页sched_setscheduler
,其中提到了 sched(7)。
有几种方法可以让你的程序具备这种能力;最简单的可能是设定帽:
# setcap cap_sys_nice=ep /usr/local/bin/your-program
其工作原理与 set-user-id 类似,但受到更多限制(因为它只提供一种功能)。当然,CAP_SYS_NICE 有效地授予程序挂起系统的权限(通过实时任务占用所有 CPU 时间)。
其他方法包括使用运行为根包装器(删除所有其他权限)或使用 RealtimeKit/PolicyKit 等进行提升。
(有关功能的更多信息,我建议从能力(7))。
答案2
我有一个解决方案,尽管它有点奇怪并且暴露了操作系统中的一个漏洞。
期间postinst
,我:
cp $(which chrt) bin/chrt
setcap cap_sys_nice+ep bin/chrt
然后在代码中,我启动一个进程:
bin/chrt -o -p 70 getpid()
我们刚刚揭露的漏洞是,任何使用此版本的人chrt
都可以在没有管理员权限的情况下执行此操作。由于我运行的是受严格控制的目标环境,所以我可以接受这个漏洞,但我不建议那些无法控制目标环境的人使用它。