另外参见

clone(2),gettid(2),capabilities(7)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

遵循规范

这些系统调用是特定于Linux的。

CAPGET - Linux手册页

Linux程序员手册 第2部分
更新日期: 2020-02-09

返回值

成功时,返回零。如果出错,则返回-1,并正确设置errno。

调用失败,并显示错误EINVAL,并将hdrp的version字段设置为_LINUX_CAPABILITY_VERSION_?的内核首选值。当指定了不受支持的版本值时。通过这种方式,可以探查当前的首选功能修订版是什么。

名称

capget,capset-设置/获取线程的功能

备注

功能查询和设置功能的可移植接口由libcap库提供,可在此处使用:

错误说明

EFAULT
错误的内存地址。 hdrp不能为NULL。仅当用户试图确定内核支持的首选功能版本格式时,datap才可以为NULL。
EINVAL
其中一个论点是无效的。
EPERM
试图将功能添加到允许的集合中,或在不在允许的集合中的有效集合中设置能力。
EPERM
An attempt was made to add a capability to the inheritable set, and either:
*
该功能不在呼叫者的边界范围内;要么
*
该能力不在呼叫者的允许集中,并且呼叫者在其有效集中缺乏CAP_SETPCAP能力。
EPERM
调用者尝试使用capset()修改线程自身的能力,但是缺少足够的特权。对于支持VFS功能的内核,这是绝对不允许的。对于缺少VFS支持的内核,需要CAP_SETPCAP功能。 (2.6.11之前的内核中的错误意味着,如果没有此功能的线程尝试通过将pid字段指定为非零值(即,getpid(2)返回的值)来尝试更改其自身的功能,也会发生此错误。的0。)
ESRCH
没有这样的线程。

说明

这两个系统调用是用于获取和设置线程功能的原始内核接口。这些系统调用不仅特定于Linux,而且内核API可能会更改,并且这些系统调用的使用(尤其是cap_user _ * _ t类型的格式)会随每个内核版本的扩展而扩展,但是旧程序将保留加工。

便携式接口为cap_set_proc(3)和cap_get_proc(3);如果可能,您应该在应用程序中使用这些接口。

Current details

现已警告您,一些当前的内核详细信息。结构定义如下。

#define _LINUX_CAPABILITY_VERSION_1  0x19980330
#define _LINUX_CAPABILITY_U32S_1     1

        /* V2 added in Linux 2.6.25; deprecated */
#define _LINUX_CAPABILITY_VERSION_2  0x20071026
#define _LINUX_CAPABILITY_U32S_2     2

        /* V3 added in Linux 2.6.26 */
#define _LINUX_CAPABILITY_VERSION_3  0x20080522
#define _LINUX_CAPABILITY_U32S_3     2

typedef struct __user_cap_header_struct {
   __u32 version;
   int pid;
} *cap_user_header_t;

typedef struct __user_cap_data_struct {
   __u32 effective;
   __u32 permitted;
   __u32 inheritable;
} *cap_user_data_t;

有效,允许和可继承字段是功能(7)中定义的功能的位掩码。请注意,CAP_ *值是位索引,在对位字段进行或运算之前,需要进行位移位。要定义传递给系统调用的结构,您必须使用struct __user_cap_header_struct和struct __user_cap_data_struct名称,因为typedef仅是指针。

2.6.25之前的内核更喜欢版本_LINUX_CAPABILITY_VERSION_1的32位功能。 Linux 2.6.25添加了版本为_LINUX_CAPABILITY_VERSION_2的64位功能集。但是,出现了API故障,Linux 2.6.26添加了_LINUX_CAPABILITY_VERSION_3来解决此问题。

请注意,64位功能使用datap [0]和datap [1],而32位功能仅使用datap [0]。

在支持文件功能(VFS功能支持)的内核上,这些系统调用的行为略有不同。此支持在Linux 2.6.24中作为一个选项添加,并在Linux 2.6.33中变为固定(非可选)。

对于capget()调用,可以通过使用hdrp-> pid字段值指定其进程ID来探查任何进程的功能。

有关数据的详细信息,请参见功能(7)。

With VFS capabilities support

VFS功能采用文件扩展属性(请参阅xattr(7))以允许将功能附加到可执行文件。此特权模型使内核不再支持一个进程异步设置另一个进程的功能。也就是说,在支持VFS功能的内核上,调用capset()时,hdrp-> pid的唯一允许值为0或等效地为gettid(2)返回的值。

Without VFS capabilities support

在不提供VFS功能支持的较旧内核上,如果调用方具有CAP_SETPCAP功能,则capset()不仅可以用于更改调用方自身的功能,还可以用于更改其他线程的功能。调用在hdrp的pid字段非零时指定的线程的功能上运行,或者在pid为0时在调用线程的功能上运行。如果pid引用单线程进程,则可以将pid指定为传统的进程ID;在多线程进程的线程上进行操作需要gettid(2)返回的类型的线程ID。对于capset(),pid也可以是:-1,表示在除调用者和init(1)之外的所有线程上执行更改;或小于-1的值,在这种情况下,更改将应用​​于ID为-pid的进程组的所有成员。

语法

#包括

int capget(cap_user_header_t hdrp,cap_user_data_t datap);

int capset(cap_user_header_t hdrp,const cap_user_data_t datap);

日期:2019-08-20 17:58:35 来源:oir作者:oir