putcmdattrs 子例程
用途
修改特权命令数据库中的多个命令属性。
库
安全库libc.a)
语法
#include <usersec.h>
int putcmdattrs(Command, Attributes, Count)
char *Command;
dbattr_t *Attributes;
int Count;描述
putcmdattrs子程序修改特权命令数据库中的一个或多个属性。 如果数据库未打开,那么此子例程将执行隐式打开以进行读取和写入。 命令参数指定的命令必须包含命令的完整路径,并存在于特权命令数据库中。
putcmdattrs子程序仅用于修改数据库中现有命令的属性。 要创建或删除命令条目,请使用putcmdattr子程序。 通过putcmdattrs子程序更改的数据必须通过调用putcmdattr子程序显式提交,并在类型参数中指定 SEC_COMMIT。 在所有数据提交之前,只有进程中的getcmdattr和getcmdattrs子程序会返回修改后的数据。 在使用setkst命令将整个数据库发送到内核安全表或重启系统之前,对特权命令数据库所做的更改不会影响安全考虑。
属性参数包含要更新的每个属性的信息。 在成功调用putcmdattrs子程序时,必须检查属性参数中指定的每个值,以确定属性参数是否已成功写入。 dbattr_t 数据结构包含以下字段:
| 名称 | 描述 | 类型 |
|---|---|---|
| S_ACCESSAUTHS | 访问权限,以空分隔的权限名称列表。 可以指定 16 个权限。 具有任何一个权限的用户都可以运行该命令。 除了系统上可用的用户定义和系统定义的权限外,还可以指定以下三个特殊值:
|
SEC_LIST |
| S_AUTHPRIVS | 授权特权。 特权授权和授权特权对指示在执行与父进程所拥有的授权相对应的命令期间的进程特权。 授权及其相应权限之间用等号(=)分隔;单个权限之间用加号(+)分隔。该属性属于SEC_LIST类型,值是一个空分隔列表,因此授权和权限对之间用一个空字符 (\0) 分隔,如下图所示:授权和特权对的数量限制为十六个。 |
SEC_LIST |
| S_AUTHROLES | 角色或角色列表,拥有这些角色的用户必须通过身份验证才能执行命令。 | SEC_LIST |
| S_INNATEPRIVS | 先天特权。 这是在运行命令时分配给进程的特权的空分隔列表。 | SEC_LIST |
| S_INHERITPRIVS | 可继承的特权。 这是分配给子进程的特权的空分隔列表。 | SEC_LIST |
| S_EUID | 运行命令时要采用的有效用户标识。 | SEC_INT |
| S_EGID | 运行命令时要采用的有效用户标识。 | SEC_INT |
| S_RUID | 运行命令时要采用的实际用户标识。 | SEC_INT |
注:上述所有字段都与 attr_name属性相对应。
| 项 | 描述 |
|---|---|
| attr_idx | 该属性由putcmdattrs子程序内部使用。 |
| attr_type | 要更新的属性的类型。 |
| attr _flag | 请求更新目标属性的结果。 成功完成时,将返回值 0。 否则,返回值为非零。 |
| 包含用于更新所请求属性的值的并集。 | |
| attr_domain | putcmdattrs子程序将忽略该字段。 |
The following union members that correspond to the definitions of the attr_char, attr_int, attr_long and attr_llong macros in the usersec.h file respectively.
| 项 | 描述 |
|---|---|
| au_char | 指向要写入SEC_CHAR和SEC_LIST类型属性值的字符指针。 |
| au_int | 要写入SEC_INT类型属性的整数值。 |
| au_long | 要写入SEC_LONG类型属性的长值。 |
| au_llong | 要写入SEC_LLONG类型属性的长数值。 |
参数
| 项 | 描述 |
|---|---|
| 命令 | 指定要更新其属性的命令名。 |
| 属性 | 指向由 0 个或多个dbattr_t类型元素组成的数组的指针。 命令属性列表在usersec.h头文件中定义。 |
| COUNT | 属性参数中数组元素的个数。 |
安全性
访问的文件:
| 文件 | 方式 |
|---|---|
|
|
返回值
如果命令参数指定的命令存在于特权命令数据库中,则putcmdattrs子例程返回 0,即使属性参数中的任何属性都未成功更新。 成功后,必须检查Attributes参数中每个元素的attr_flag属性,以确定是否已成功更新。 如果失败,则返回值为-1,并设置errno值来指示错误。
错误代码
如果putcmdattrs子例程返回-1,则可以设置下列errno值之一:
| 项 | 描述 |
|---|---|
| EINVAL | 命令参数为NULL、默认值或ALL。 |
| EINVAL | Count 参数小于零。 |
| EINVAL | 属性参数为空,计数 参数大于零。 |
| EINVAL | Attributes 参数未指向所请求属性的有效数据。 |
| ENOENT | 命令参数中指定的命令不存在。 |
| EPERM | 不允许该操作。 |
如果putcmdattrs子程序更新属性失败,相应属性元素的attr_flag字段将返回以下错误之一:
| 项 | 描述 |
|---|---|
| EACCES | 调用者对特权命令数据库没有写访问权。 |
| EINVAL | 属性"条目中的attr_name字段不是公认的命令属性。 |
| EINVAL | 属性 条目中的attr_type字段包含无效类型。 |
| EINVAL | 属性 "条目中的attr_un字段未指向有效缓冲区或此类属性的有效数据。 |