我的程序使用Linux系统调用setpriority()来改变它创建的线程的优先级。它需要设置负优先级(-10),但是,正如文档中提到的,当以普通用户身份运行时,这会失败。用户需要CAP_SYS_NICE功能来设置他想要的优先级,但是我不知道如何给予这样的功能给用户。那么我的问题是:如何为Linux用户设置CAP_SYS_NICE功能?
setpriority()
CAP_SYS_NICE
7fhtutme1#
有一个很好的实用程序可以在二进制文件上设置功能:setcap。这需要在应用程序二进制文件上以root用户身份运行,但一旦设置,就可以以普通用户身份运行。示例:
$ sudo setcap 'cap_sys_nice=eip' <application>
字符串您可以使用getcap确认应用程序上的功能:
$ getcap <application><application> = cap_sys_nice+eip
$ getcap <application>
<application> = cap_sys_nice+eip
型我建议在安装行中将这些功能集成到makefile中,这通常是以root身份运行的。请注意,功能不能存储在TAR文件或任何衍生包格式中。如果您稍后打包应用程序,您将需要一个脚本(对于Debian软件包为postinst)来在部署时应用功能。
11dmarpk2#
Jan Hudec认为进程不能仅仅给予自己一种能力,setuid Package 器是获得这种能力的明显方式。另外,请记住,当您删除root时,您需要prctl(PR_SET_KEEPCAPS, ...)。(有关详细信息,请参阅prctl手册页。)否则,当您转换到非root真实的用户ID时,您将删除这种能力。如果你真的只是想启动一个不同的允许的nice级别的用户会话,你可能会看到pam_limits和limits.conf手册页,因为pam_limits模块允许你更改硬nice限制。它可以是这样的一行:
prctl(PR_SET_KEEPCAPS, ...)
prctl
pam_limits
limits.conf
yourspecialusername hard nice -10
字符串
lbsnaicq3#
AFAIK获取一个能力是不可能的。根进程拥有所有的能力,并且可以给予它们,但是一旦放弃,它们就不能被重新获得。所以你需要一个suid-root Package 器,它将给予所有其他的能力并运行进程。
hxzsmxv24#
如果你通过sudo拥有root权限,你可以使用setpriv来为命令添加任何你想要的功能。不过,使用它是一件真实的痛苦的事情,所以我为它写了一个脚本。
setpriv
#!/bin/bashuid="$(id -u)"gid="$(id -g)"sudo --preserve-env \ setpriv --reuid="$uid" --regid="$gid" --init-groups \ --inh-caps +sys_nice --ambient-caps +sys_nice \ "$@"
#!/bin/bash
uid="$(id -u)"
gid="$(id -g)"
sudo --preserve-env \
setpriv --reuid="$uid" --regid="$gid" --init-groups \
--inh-caps +sys_nice --ambient-caps +sys_nice \
"$@"
字符串保存为/usr/local/bin/chyort和chmod +x。要使用该脚本,请在需要实时权限的命令前面加上chyort:
/usr/local/bin/chyort
chmod +x
chyort
$ chyort jackd -d alsa -r 44100 -p 256
型(The名称的灵感来自chrt和chrt。
chrt
rqenqsqc5#
关于sudo,我这样添加了用户:
niceuser ALL=NOPASSWD:/usr/bin/nice
字符串然后它工作得很好:
niceuser@localhost $ nice0niceuser@localhost $ sudo nice -n -10 nice-10
niceuser@localhost $ nice
0
niceuser@localhost $ sudo nice -n -10 nice
-10
型
5条答案
按热度按时间7fhtutme1#
有一个很好的实用程序可以在二进制文件上设置功能:setcap。这需要在应用程序二进制文件上以root用户身份运行,但一旦设置,就可以以普通用户身份运行。示例:
字符串
您可以使用getcap确认应用程序上的功能:
型
我建议在安装行中将这些功能集成到makefile中,这通常是以root身份运行的。请注意,功能不能存储在TAR文件或任何衍生包格式中。如果您稍后打包应用程序,您将需要一个脚本(对于Debian软件包为postinst)来在部署时应用功能。
11dmarpk2#
Jan Hudec认为进程不能仅仅给予自己一种能力,setuid Package 器是获得这种能力的明显方式。另外,请记住,当您删除root时,您需要
prctl(PR_SET_KEEPCAPS, ...)
。(有关详细信息,请参阅prctl
手册页。)否则,当您转换到非root真实的用户ID时,您将删除这种能力。如果你真的只是想启动一个不同的允许的nice级别的用户会话,你可能会看到
pam_limits
和limits.conf
手册页,因为pam_limits
模块允许你更改硬nice限制。它可以是这样的一行:字符串
lbsnaicq3#
AFAIK获取一个能力是不可能的。根进程拥有所有的能力,并且可以给予它们,但是一旦放弃,它们就不能被重新获得。所以你需要一个suid-root Package 器,它将给予所有其他的能力并运行进程。
hxzsmxv24#
如果你通过sudo拥有root权限,你可以使用
setpriv
来为命令添加任何你想要的功能。不过,使用它是一件真实的痛苦的事情,所以我为它写了一个脚本。字符串
保存为
/usr/local/bin/chyort
和chmod +x
。要使用该脚本,请在需要实时权限的命令前面加上
chyort
:型
(The名称的灵感来自
chrt
和chrt
。rqenqsqc5#
关于sudo,我这样添加了用户:
字符串
然后它工作得很好:
型