【问题标题】:How to set CAP_SYS_NICE capability to a Linux user?如何为 Linux 用户设置 CAP_SYS_NICE 能力?
【发布时间】:2011-10-03 13:18:18
【问题描述】:

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

用户需要CAP_SYS_NICE 能力才能根据需要设置优先级,但我不知道如何为用户提供这种能力。

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

【问题讨论】:

  • Nice -10 的优先级更高,但绝对不是远程实时的。
  • 这只是一个指针,所以我添加一个评论:检查这个答案:stackoverflow.com/a/17685265/6899

标签: linux real-time


【解决方案1】:

有一个很好的实用工具可以设置二进制文件的功能:setcap。这需要在您的应用程序二进制文件上以 root 身份运行,但一旦设置,就可以作为普通用户运行。示例:

$ sudo setcap 'cap_sys_nice=eip' <application>

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

$ getcap <application>
<application> = cap_sys_nice+eip

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

【讨论】:

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

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

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

yourspecialusername hard nice -10

【讨论】:

  • 我知道这个答案比泥土更古老,但有 pam_cap.so 模块将读取/etc/security/capability.conf 并相应地设置功能
【解决方案3】:

AFAIK 不可能获得能力。根进程拥有所有能力,可以放弃,但一旦放弃,就无法重新获得。因此,您需要一个 suid-root 包装器,它会放弃所有其他功能并运行该进程。

【讨论】:

    【解决方案4】:

    关于 sudo,我是这样添加用户的:

    niceuser ALL=NOPASSWD:/usr/bin/nice
    

    然后它工作正常:

    niceuser@localhost $ nice
    0
    niceuser@localhost $ sudo nice -n -10 nice
    -10
    

    【讨论】:

    • 不要这样做。它以 root 身份运行命令,这不是您通常想要的,也不是原始问题所寻找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 2021-03-27
    • 2021-02-01
    • 1970-01-01
    相关资源
    最近更新 更多