赋予用户调度权限

赋予用户调度权限

我有一些使用的代码sched_setschedulersched.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都可以在没有管理员权限的情况下执行此操作。由于我运行的是受严格控制的目标环境,所以我可以接受这个漏洞,但我不建议那些无法控制目标环境的人使用它。

相关内容