只有在可inheritance的集合中才有能力是什么意思?

我的程序正在用cap_sys_admin,cap_setgid+i
当然,我知道他们是可以inheritance的,但除此之外,他们的行为方式,就好像我根本没有,因为他们既不有效也不允许。

好吧,你的进程运行一些可继承的功能。 这对您的流程意味着什么? 几乎没有什么。 你不能调用setcap()来使任何这些功能有效,因为它们不在你的Permitted集合中,也没有办法让它们进入你的Effective集合,你的进程不能使用这个功能本身。

然而,它们在你的可继承集合中的存在可能会对你启动的其他进程产生影响。 例如。 如果你想exec()一个二进制文件的cap_setgid在Effective和Inheritable集合中,那么这个子进程将以cap_setgid的有效集合开始。

如果在上面的例子中cap_setgid 不在你的进程的可继承集合中,那么这个文件具有cap_setgid+ie的事实就变成了不可信的事实,并且子进程将具有所声明的能力。

是的,继承保持沉睡,直到你设置有效的能力。 如手册中所述,继承意味着:“当execve,副本继承到继承和允许的子节点”:

 This is a set of capabilities preserved across an execve(2). Inheritable capa‐ bilities remain inheritable when executing any program, and inheritable capa‐ bilities are added to the permitted set when executing a program that has the corresponding bits set in the file inheritable set. 

http://man7.org/linux/man-pages/man7/capabilities.7.html