如何为Linux用户设置CAP_SYS_NICE功能?

CJl*_*ano 13 linux real-time

我的程序正在使用Linux系统调用setpriority()来更改它创建的线程的优先级.它需要设置负优先级(-10),但是,如文档中所述,当以普通用户身份运行时,这会失败.

用户需要CAP_SYS_NICE能够根据需要设置优先级,但我不知道如何为用户提供此类功能.

所以我的问题是:如何为CAP_SYS_NICELinux用户设置功能?

Rya*_*ong 11

有一个非常方便的实用程序来设置二进制文件的功能:setcap.这需要在应用程序二进制文件上以root身份运行,但一旦设置,就可以作为普通用户运行.例:

$ sudo setcap 'cap_sys_nice=eip' <application>
Run Code Online (Sandbox Code Playgroud)

您可以使用getcap确认应用程序的功能:

$ getcap <application>
<application> = cap_sys_nice+eip
Run Code Online (Sandbox Code Playgroud)

我建议将这些功能集成到安装行中的makefile中,无论如何通常以root身份运行.请注意,功能无法存储在TAR文件或任何衍生包格式中.如果您稍后打包应用程序,则需要一个脚本(Debian软件包的postinst)来应用部署功能.

  • @elmicha至少在我的系统上,man setcap页面包含以下行:_功能以cap_from_text(3)_中描述的形式指定.请注意,默认情况下,cap_from_text联机帮助页可能不可用(即使您有setcap).例如,在CentOS上,它可以在libcap-devel包中找到.它将额外的字母描述为"运算符标志",其中e =有效,i =可继承,p =允许. (4认同)
  • 您的命令有效,但请问您在哪里找到了 `cap_sys_nice=eip`,尤其是 `=eip` 部分?我在`man setcap`和`man capabilities`中都看不到它。 (2认同)

mkj*_*mkj 4

Jan Hudec 是对的,进程不能只给自己一种能力,而 setuid 包装器是获得该能力的明显方法。另外,请记住,prctl(PR_SET_KEEPCAPS, ...)当您放弃 root 时,您将需要这样做。(prctl有关详细信息,请参阅手册页。)否则,当您转换为非 root 真实用户 ID 时,您将放弃该功能。

如果您确实只想启动具有不同允许的良好级别的用户会话,您可能会看到pam_limitslimits.conf手册页,因为该pam_limits模块允许您更改硬性良好限制。它可能是这样的一行:

yourspecialusername hard nice -10
Run Code Online (Sandbox Code Playgroud)

  • 我知道这个答案比污垢还要老,但是有一个 pam_cap.so 模块,它将读取 `/etc/security/capability.conf` 并相应地设置功能 (4认同)