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

smtd7mpg  于 2023-11-17  发布在  Linux
关注(0)|答案(5)|浏览(209)

我的程序使用Linux系统调用setpriority()来改变它创建的线程的优先级。它需要设置负优先级(-10),但是,正如文档中提到的,当以普通用户身份运行时,这会失败。
用户需要CAP_SYS_NICE功能来设置他想要的优先级,但是我不知道如何给予这样的功能给用户。
那么我的问题是:如何为Linux用户设置CAP_SYS_NICE功能?

7fhtutme

7fhtutme1#

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

  1. $ sudo setcap 'cap_sys_nice=eip' <application>

字符串
您可以使用getcap确认应用程序上的功能:

  1. $ getcap <application>
  2. <application> = cap_sys_nice+eip


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

11dmarpk

11dmarpk2#

Jan Hudec认为进程不能仅仅给予自己一种能力,setuid Package 器是获得这种能力的明显方式。另外,请记住,当您删除root时,您需要prctl(PR_SET_KEEPCAPS, ...)。(有关详细信息,请参阅prctl手册页。)否则,当您转换到非root真实的用户ID时,您将删除这种能力。
如果你真的只是想启动一个不同的允许的nice级别的用户会话,你可能会看到pam_limitslimits.conf手册页,因为pam_limits模块允许你更改硬nice限制。它可以是这样的一行:

  1. yourspecialusername hard nice -10

字符串

lbsnaicq

lbsnaicq3#

AFAIK获取一个能力是不可能的。根进程拥有所有的能力,并且可以给予它们,但是一旦放弃,它们就不能被重新获得。所以你需要一个suid-root Package 器,它将给予所有其他的能力并运行进程。

hxzsmxv2

hxzsmxv24#

如果你通过sudo拥有root权限,你可以使用setpriv来为命令添加任何你想要的功能。不过,使用它是一件真实的痛苦的事情,所以我为它写了一个脚本。

  1. #!/bin/bash
  2. uid="$(id -u)"
  3. gid="$(id -g)"
  4. sudo --preserve-env \
  5. setpriv --reuid="$uid" --regid="$gid" --init-groups \
  6. --inh-caps +sys_nice --ambient-caps +sys_nice \
  7. "$@"

字符串
保存为/usr/local/bin/chyortchmod +x
要使用该脚本,请在需要实时权限的命令前面加上chyort

  1. $ chyort jackd -d alsa -r 44100 -p 256


(The名称的灵感来自chrtchrt

展开查看全部
rqenqsqc

rqenqsqc5#

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

  1. niceuser ALL=NOPASSWD:/usr/bin/nice

字符串
然后它工作得很好:

  1. niceuser@localhost $ nice
  2. 0
  3. niceuser@localhost $ sudo nice -n -10 nice
  4. -10

相关问题