setpenv 子例程
用途
设置当前流程环境。
库
安全性库 (libc.a)
语法
#include < usersec.h >
int setpenv ( 用户, 方式, 环境, 命令) char *用户; int Mode; char **Environment; char *命令;
描述
setpenv 子例程首先根据其参数值设置当前进程的环境,然后设置工作目录并运行指定的命令。 如果指定了 User 参数,那么会将进程环境设置为指定用户的进程环境,设置用户的工作目录,并运行指定的命令。 如果未指定 User 参数,那么环境和工作目录将设置为当前进程的环境和工作目录,并从此进程运行命令。 环境由用户状态和系统状态环境变量组成。
注: setpenv 子例程要求 setpcred 子例程在它之前。
setpenv 子例程执行以下步骤:
| 项 | 描述 |
|---|---|
| 设置流程环境 | 第一步涉及更改用户状态和系统状态环境。 由于这取决于 Mode 和 Environment 参数的值,请参阅 Mode 参数的描述以获取更多信息。 |
| 设置进程当前工作目录 | 设置用户状态和系统状态环境后,可以设置进程的工作目录。 如果 Mode 参数包含 PENV_INIT 值, 当前工作目录将更改为用户的初始登录目录 (在 /etc/passwd 文件中定义)。 否则,当前工作目录保持不变。 |
| 执行初始程序 | 进程的工作目录复位后,执行初始程序 (通常是 shell 解释器)。 如果 Command 参数为空,那么将使用用户数据库中的 shell。 如果未定义该参数,那么将使用用户状态环境中的 shell ,并且 Command 参数缺省为 /usr/bin/sh 文件。 如果 Command 参数不为空,那么它指定要执行的命令。 如果 Mode 参数包含 PENV_ARGV 值, 假定 Command 参数在 argv 结构中,并传递给 execve 子例程。 包含在 Command 参数中的字符串用作 execve 子例程的 Path 参数。 如果 Mode 参数不包含 PENV_ARGV 值,那么会将 Command 参数解析为 argv 结构并执行。 如果 Command 参数包含 $SHELL 值,那么将在执行之前执行替换。 注: 如果 Command 参数包含 $SHELL 值,但用户状态环境不包含 SHELL 值,那么此步骤将失败。
|
参数
- 命令
- 指定要执行的命令。 如果 Mode 参数包含 PENV_ARGV 值, 那么假定 Command 参数是 execv 子例程的有效自变量向量。
- 环境
- 以 getpenv 子例程返回的相同格式指定用户状态和系统状态环境变量的值。 用户状态变量以关键字 USRENVIRON:作为前缀,系统状态变量以关键字 SYSENVIRON:作为前缀。 每个变量都由格式为 var=value的字符串定义,该字符串是以 null 结束的字符指针的数组。
- 方式
- 指定 setpenv 子例程如何设置环境并运行命令。 此参数是位掩码,必须仅包含下列其中一个值,这些值在 usersec.h 文件中定义:
- PENV_INIT
- 按如下所示初始化用户状态环境:
- 授权状态
- 从当前环境保留。 如果 AUTHSTATE 值不存在,那么缺省为 compat 值。
- KRB5CCNAME
- 从当前环境保留。 如果通过 Distributed Computing Environment (DCE) 进行认证,那么将定义此值。
- USER
- 设置为 User 参数指定的名称或与当前实际用户标识对应的名称。 名称将缩短为最大 PW_USERNAME_LEN,包括尾部 NUL 字符。 PW_USERNAME_LEN 是正在运行的系统的最大值。 PW_USERNAME_LEN 的值最多可以为 MAXIMPL_LOGIN_NAME_MAX (或 256 个字符) ,并且必须至少为 9 个字符。
- 登录
- 设置为 User 参数指定的名称或与当前实际用户标识对应的名称。 如果由 User 参数设置,那么此值是完整登录名,其中可能包含 DCE 单元名称。
- logname
- 设置为当前系统环境变量 LOGNAME。
- TERM
- 从当前环境保留。 如果 TERM 值不存在,那么缺省为 IBM6155。
- SHELL
- 从为当前进程的实际用户标识定义的初始程序设置。 如果未定义任何程序,那么将使用 /usr/bin/sh shell 作为缺省值。
- HOME
- 从为当前进程的实际用户标识定义的主目录设置。 如果未定义主目录,那么缺省值为 /home/guest。
- 路径
- 最初设置为 /etc/environment 文件中 PATH 值的值。 如果未设置,那么会以破坏性方式将其替换为缺省值 PATH=/usr/bin:$HOME:. (最后一个句点指定工作目录)。 如果/等/环境 文件中存在 路径 值,那么 路径 变量将以破坏性方式替换为 /etc/security/environ 文件中此用户的 乌斯伦夫 属性。
对于其他环境变量,将读取以下文件:
- /etc/environment
- 此文件中定义的变量将添加到环境中。
- /etc/security/environ
- 在此文件中为用户定义的环境变量将添加到用户状态环境中。
Environment 参数中的用户状态变量将添加到用户状态环境。 这些前面是 USRENVIRON: 关键字。
系统状态环境初始化如下:
- logname
- 设置为受保护用户环境中的当前 LOGNAME 值。 login (tsm) 命令将此值传递到 setpenv 子例程以确保正确性。
- 名称
- 设置为与实际用户标识对应的登录名。
- TTY
- 设置为与标准输入对应的 TTY 名称。
对于其他环境变量,将读取以下文件:
- /etc/security/environ
- 在此文件中为用户定义的系统状态环境变量将添加到环境中。 Environment 参数中的系统状态变量将添加到环境中。 这些前面有 SYSENVIRON 关键字。
- PENV_DELTA
- 将保留现有用户状态和系统状态环境变量,并添加 Environment 参数中定义的变量。
- PENV_RESET
- 将清除现有环境,并将其完全替换为 Environment 参数的内容。
- PENV_KLEEN
- 在执行命令之前,关闭所有打开的文件描述符 (0 , 1 和 2 除外)。 此值必须在逻辑上与 PENV_DELTA, PENV_RESET或 PENV_INIT配合使用。 不能单独使用。
- PENV_NOPROF
- 新 shell 将不会被视为登录 shell 程序。 仅当与 PENV_INIT 标志一起使用时才有效。
对于系统状态和用户状态环境,将执行变量替换。
Mode 参数还可以包含:
| 项 | 描述 |
|---|---|
| PENV_ARGV | 指定 Command 参数已采用 argv 格式,无需解析。 此值必须在逻辑上与 PENV_DELTA, PENV_RESET或 PENV_INIT配合使用。 不能单独使用。 |
| 项 | 描述 |
|---|---|
| 用户 | 指定要设置其环境和工作目录并运行指定命令的用户名。 如果给定了空指针,那么将使用当前实际 uid 来确定用户的名称。 |
返回值
如果已成功建立环境,那么此函数不会返回。 如果setpenv子程序失败,则返回值为-1,并设置errno全局变量来指示错误。
错误代码
如果下列其中一个或多个为 true ,那么 setpenv 子例程将失败:
| 项 | 描述 |
|---|---|
| EINVAL | Mode 参数包含除 PENV_INIT, PENV_DELTA, PENV_RESET或 PENV_ARGV以外的值。 |
| EINVAL | Mode 参数包含多个 PENV_INIT, PENV_DELTA或 PENV_RESET 值。 |
| EINVAL | Environment 参数既不为 null 也不为空,并且不包含有效的环境字符串。 |
| 项 | 描述 |
|---|---|
| EPERM | 调用者对为系统定义的环境没有读访问权,或者用户无权更改指定的属性。 |
其他错误可由 setpenv 子例程调用的子例程设置。