chpass 子例程

用途

更改用户密码。

标准 C 库 (libc.a)

线程安全库 (libs_r.a)

语法

int chpass (UserName,  Response,  Reenter,  Message)
char *UserName;
char *Response;
int *Reenter;
char **Message;

描述

chpass 子例程维护用户为更改密码而必须满足的要求。 此子例程是用于更改密码的基本构建块,用于处理本地, NIS 和 DCE 用户密码的密码更改。

Message 参数提供了一系列要求旧密码和新密码的消息,或者提供参考消息,例如密码更改失败的原因。 第一个 消息 提示是旧密码的提示。 如果用户具有实际用户标识 0 (零) 并且正在更改本地用户,或者如果用户没有当前密码,那么此参数不会提示输入旧密码。 chpass 子例程不会提示具有 root 用户权限的用户输入旧密码。 它通知程序未发送任何消息,并且应该再次调用 chpass 。 如果用户满足第一个 Message 参数的提示,那么系统会提示用户输入新密码。 每条消息都包含在 Message 参数中,并向用户显示。 Response 参数返回用户对 chpass 子例程的响应。

Reenter 参数指示用户何时满足所有提示消息。 该参数保持非零,直到用户传递了所有提示为止。 在 Reenter 的返回值为 0 之后,返回码指示密码更改是成功还是失败。 在对用户进行提示时,调用者必须在 chpass的调用之间维护 Reenter 的值。

chpass 子例程维护有关要呈现给用户的下一条提示消息的内部状态信息。 如果在为用户完成所有提示消息之前,调用程序提供不同的用户名,那么将重置内部状态信息并重新开始提示消息。 状态信息也保留在 Reenter 变量中。 调用程序必须在调用 chpass之间保留 Reenter 的值。

chpass 子例程确定在密码更改期间要使用的管理域。 它确定用户是在本地定义,在网络信息服务 (NIS) 中定义还是在 Distributed Computing Environment (DCE) 中定义。 密码更改仅在这些域中发生。 系统管理员可以使用 /etc/security/user 文件中的注册表值来覆盖此约定。 如果定义了注册表值,那么只能在指定的域中进行密码更改。 如果用户是在定期关闭的远程机器上管理的,那么系统管理员可以使用此注册表值。 如果允许用户在服务器关闭时通过其他某种认证方法登录,那么密码仍将更改为仅跟随主服务器。

chpass 子例程允许用户以两种方式更改密码。 对于正常 (非管理) 密码更改,用户必须在第一次调用 chpass 子例程时或响应来自 chpass的第一条消息时提供旧密码。 如果用户是 0 的 root 用户实际用户标识,那么将通过在初始调用期间为 Response 参数提供空指针来处理本地管理密码更改

将始终向未在本地管理的用户查询其旧密码。

chpass 子例程始终处于下列其中一种状态:
  1. 初始状态: 调用者使用 NULL response 参数调用 chpass 子例程,并在 message 参数中接收初始密码提示。
  2. 验证初始密码: 调用者使用先前的 message 参数作为 response 参数提示用户的结果来调用 chpass 子例程。 将提示调用者在 message 参数中输入新密码。
  3. 输入新密码: 调用者使用 response 参数中的新密码提示提示用户的结果来调用 chpass 子例程。 将提示调用者在 message 参数中重复新密码。
  4. 验证新密码: 调用者使用提示用户在 response 参数中重复新密码的结果来调用 chpass 子例程。 然后, chpass 子例程执行实际密码更改。

上述进程中的任何步骤都可能导致 chpass 子例程终止对话。 当 reenter 变量设置为 0时,将发出此信号。 返回码指示故障的性质。

注: 将 setuid 和 owner 设置为使用 chpass 子例程的您自己的程序的 root 用户。

参数

描述
UserName 指定要更改其密码的用户的名称。
Response 指定包含用户对最后一个提示的响应的字符串。
重新输入 指向用于指示 chpass 子例程是否已完成处理的布尔值。 如果 Reenter 参数是非零值,那么 chpass 子例程期望用户满足 Message 参数提供的提示消息。 如果 Reenter 参数为 0 ,那么 chpass 子例程已完成处理。
消息 指向 chpass 子例程为其分配内存并填充的指针。 然后,此替换字符串适合打印并发出提问消息 (如果 Reenter 参数是非零值)。 该字符串还可以发出参考消息,例如用户未能更改密码的原因 (如果 Reenter 参数为 0)。 调用应用程序负责释放此内存。

返回值

成功完成时, chpass 子例程返回值 0。 如果 chpass 子例程不成功,那么它返回以下值:

描述
-1 指示线程安全库 libs_r.a中的调用失败。 ERRNO 将指示故障代码。
第 1 年 指示密码更改失败,用户应该再次尝试。 如果未满足密码限制 (例如,密码不够长) ,那么会发生此返回值。
2 指示密码更改失败,用户不应再次尝试。 如果用户输入了不正确的旧密码,或者网络已关闭 (无法更改密码) ,那么将发生此返回值。

错误代码

如果下列其中一个值为 true ,那么 chpass 子例程不成功:

描述
ENOENT 指示找不到用户。
ESAD 指示用户不满足更改密码的条件。
EPERM 指示用户没有更改密码的许可权。
EINVAL 指示参数无效。
ENOMEM 指示内存分配 (malloc) 失败。