3.1. 应用程序可以期望什么

3.1.1. PAMTransaction 的初始化

#include <security/pam_appl.h> 
   int pam_start( 
   service_name,  
   user,  
   pam_conversation,  
   pamh); 
 const char *service_name; 
 const char *user; 
 const struct pam_conv *pam_conversation; 
 pam_handle_t **pamh; 
   int pam_start_confdir( 
   service_name,  
   user,  
   pam_conversation,  
   confdir,  
   pamh); 
 const char *service_name; 
 const char *user; 
 const struct pam_conv *pam_conversation; 
 const char *confdir; 
 pam_handle_t **pamh; 

3.1.1.1. DESCRIPTION

pam_start函数创建 PAM 上下文并启动 PAM 事务。它是应用程序需要调用的第一个 PAM 函数。事务状态完全包含在此句柄标识的结构内,因此可以并行处理多个事务。但是不可能对不同的事务使用相同的句柄,每个新的上下文都需要一个新的句柄。

  • service_name *参数指定要应用的服务的名称,并将在新上下文中存储为 PAM_SERVICE 项。该服务的策略将从文件/etc/pam.d/service_name读取,或者如果该文件不存在,则从/etc/pam.conf读取。

  • user *参数可以指定目标用户的名称,并将存储为 PAM_USER 项。如果参数为 NULL,则模块必须在必要时要求此项。

  • pam_conversation 参数指向一个 struct pam_conv *结构,该结构描述了要使用的对话功能。应用程序必须提供此功能,以便在加载的模块和应用程序之间进行直接通信。

成功返回(PAM_SUCCESS)之后,* pamh 的内容是一个句柄,其中包含用于后续调用 PAM 函数的 PAM 上下文。在错误的情况下, pamh *的内容未定义。

  • pam_handle_t *是一个盲目结构,应用程序不应尝试直接对其进行探测以获取信息。相反,PAM 库提供了函数 pam_set_item(3)和 pam_get_item(3)。只要以前未在其上调用pam_end,便不能同时将其用于多个身份验证。

pam_start_confdir函数的行为类似于pam_start函数,但是它还允许设置* confdir 参数和目录路径,以覆盖服务策略文件的默认(/etc/pam.d)路径。如果 confdir *为 NULL,则该函数的工作方式与pam_start完全相同。

3.1.1.2. 返回值

  • PAM_ABORT

    • General failure.
  • PAM_BUF_ERR

    • 内存缓冲区错误。
  • PAM_SUCCESS

    • 事务已成功启动。
  • PAM_SYSTEM_ERR

    • 系统错误,例如,提交了 NULL 指针而不是数据指针。

3.1.2. 终止 PAMTransaction

#include <security/pam_appl.h> 
   int pam_end( 
   pamh,  
   pam_status); 
 pam_handle_t *pamh; 
 int pam_status; 

3.1.2.1. DESCRIPTION

pam_end函数终止 PAM 事务,并且是应用程序在 PAM 上下文中应调用的最后一个函数。返回时,句柄* pamh *不再有效,与之关联的所有内存将无效。

  • pam_status *参数应设置为上一次 PAM 库调用返回给应用程序的值。

  • pam_status 取的值用作模块特定的回调函数cleanup()的参数(请参阅 pam_set_data(3)和 pam_get_data(3))。这样,可以向模块通知拆解过程的通过/失败性质,并在取消链接之前执行适合于该模块的任何最新任务。可以将此参数与 PAM_DATA_SILENT *进行逻辑或运算,以指示该模块不应对调用进行过于认真的对待。通常用于指示库的当前关闭是在 fork(2)进程中,并且父级将负责清理当前进程空间之外的内容(文件等)。

  • free *函数的所有内存用于与 pam_set_item(3)和 pam_get_item(3)函数关联的项目。与此类对象关联的指针在调用pam_end之后不再有效。

3.1.2.2. 返回值

  • PAM_SUCCESS

    • Transaction 成功终止。
  • PAM_SYSTEM_ERR

    • 系统错误,例如,将 NULL 指针提交为 PAM 句柄或模块调用了该函数。

3.1.3. 设置 PAM 项目

#include <security/pam_modules.h> 
   int pam_set_item( 
   pamh,  
   item_type,  
   item); 
 pam_handle_t *pamh; 
 int item_type; 
 const void *item; 

3.1.3.1. DESCRIPTION

pam_set_item功能允许应用程序和 PAM 服务模块访问和更新* item_type 的 PAM 信息。为此,将创建 item 参数指向的对象的副本。支持以下 item_type *:

  • PAM_SERVICE

    • 服务名称(标识 PAM 功能将用来认证程序的 PAM 堆栈)。
  • PAM_USER

    • 将提供身份服务的实体的用户名。也就是说,经过身份验证后,* PAM_USER 会标识使用该服务的本地实体。注意,该值可以通过 PAM 堆栈中的任何模块从某些内容(例如“匿名”)Map 到其他内容(例如“ guest119”)。因此,在每次调用 PAM 函数后,应用程序都应查询 PAM_USER *的值。
  • PAM_USER_PROMPT

    • 提示 Importing 用户名时使用的字符串。该字符串的默认值为“ login:”的本地化版本。
  • PAM_TTY

    • 终端名称:如果是设备文件,则以/dev/作为前缀;对于基于 X 的图形应用程序,此项的值应为* $ DISPLAY *变量。
  • PAM_RUSER

    • 请求用户名:本地请求用户的本地名称或远程请求用户的远程用户名称。

通常,应用程序或模块将尝试提供经过最强身份验证的值(本地帐户先于远程帐户)。对该值的信任级别体现在与应用程序关联的实际身份验证堆栈中,因此最终位于系统 Management 员的酌处权。

  • PAM_RUSER @ PAM_RHOST 应该始终标识请求用户。在某些情况下, PAM_RUSER *可能为 NULL。在这种情况下,不清楚请求实体是谁。
  • PAM_RHOST

    • 请求主机名(* PAM_RUSER 实体正在从中请求服务的机器的主机名)。也就是说 PAM_RUSER @ PAM_RHOST 确实标识了发出请求的用户。在某些应用程序中, PAM_RHOST *可能为 NULL。在这种情况下,不清楚身份验证请求的来源。
  • PAM_AUTHTOK

    • 认证令牌(通常是密码)。除 pam_sm_authenticate(3)和 pam_sm_chauthtok(3)外,所有模块功能都应忽略此令牌。在前一个功能中,它用于将最新的身份验证令牌从一个堆叠模块传递到另一个模块。在后一种功能中,令牌用于其他目的。它包含当前活动的身份验证令牌。
  • PAM_OLDAUTHTOK

    • 旧的身份验证令牌。除 pam_sm_chauthtok(3)之外的所有模块功能均应忽略此令牌。
  • PAM_CONV

    • pam_conv 结构。参见 pam_conv(3)。

以下附加项目特定于 Linux-PAM,不应在可移植应用程序中使用:

  • PAM_FAIL_DELAY

    • 用于重定向集中 Management 的故障延迟的函数指针。参见 pam_fail_delay(3)。
  • PAM_XDISPLAY

    • X 显示的名称。对于基于 X 的图形应用程序,此项的值应为* $ DISPLAY 变量。此值可以独立于 PAM_TTY *使用,以传递显示名称。
  • PAM_XAUTHDATA

    • 指向包含 X 认证数据的结构的指针,该数据需要与* PAM_XDISPLAY *指定的显示器构建连接(如果需要)。请参阅 pam_xauth_data(3)。
  • PAM_AUTHTOK_TYPE

    • 默认操作是模块在请求密码时使用以下提示:“ New UNIX password:”和“ Retype UNIX password:”。示例词* UNIX *可以替换为该项目,默认情况下为空。 pam_get_authtok(3)使用此项目。

对于除* PAM_CONV 和 PAM_FAIL_DELAY 之外的所有* item_type item 是指向\ 终止的字符串的指针。对于 PAM_CONV, item 指向已初始化的 pam_conv 结构。对于 PAM_FAIL_DELAY, item *是函数指针:void (*delay_fn)(int retval, unsigned usec_delay, void *appdata_ptr)

返回到应用程序之前,PAM_AUTHTOK 和 PAM_OLDAUTHTOK 都将被重置。这意味着应用程序无法访问身份验证令牌。

3.1.3.2. 返回值

  • PAM_BAD_ITEM

    • 应用程序试图设置一个未定义或不可访问的项目。
  • PAM_BUF_ERR

    • 内存缓冲区错误。
  • PAM_SUCCESS

    • 数据更新成功。
  • PAM_SYSTEM_ERR

    • 作为第一个参数传递的* pam_handle_t *无效。

3.1.4. 获取 PAM 项目

#include <security/pam_modules.h> 
   int pam_get_item( 
   pamh,  
   item_type,  
   item); 
 const pam_handle_t *pamh; 
 int item_type; 
 const void **item; 

3.1.4.1. DESCRIPTION

pam_get_item功能允许应用程序和 PAM 服务模块访问和检索* item_type 的 PAM 信息。成功返回后, item 包含一个指向相应项目值的指针。注意,这是指向实际数据的指针,并且不应 free()*编辑或覆盖! * item_type *支持以下值:

  • PAM_SERVICE

    • 服务名称(标识 PAM 功能将用来认证程序的 PAM 堆栈)。
  • PAM_USER

    • 将提供身份服务的实体的用户名。也就是说,经过身份验证后,* PAM_USER 会标识使用该服务的本地实体。注意,该值可以通过 PAM 堆栈中的任何模块从某些内容(例如“匿名”)Map 到其他内容(例如“ guest119”)。因此,在每次调用 PAM 函数后,应用程序都应查询 PAM_USER *的值。
  • PAM_USER_PROMPT

    • 提示 Importing 用户名时使用的字符串。该字符串的默认值为“ login:”的本地化版本。
  • PAM_TTY

    • 终端名称:如果是设备文件,则以/dev/作为前缀;对于基于 X 的图形应用程序,此项的值应为* $ DISPLAY *变量。
  • PAM_RUSER

    • 请求用户名:本地请求用户的本地名称或远程请求用户的远程用户名称。

通常,应用程序或模块将尝试提供经过最强身份验证的值(本地帐户先于远程帐户)。对该值的信任级别体现在与应用程序关联的实际身份验证堆栈中,因此最终位于系统 Management 员的酌处权。

  • PAM_RUSER @ PAM_RHOST 应该始终标识请求用户。在某些情况下, PAM_RUSER *可能为 NULL。在这种情况下,不清楚请求实体是谁。
  • PAM_RHOST

    • 请求主机名(* PAM_RUSER 实体正在从中请求服务的机器的主机名)。也就是说 PAM_RUSER @ PAM_RHOST 确实标识了发出请求的用户。在某些应用程序中, PAM_RHOST *可能为 NULL。在这种情况下,不清楚身份验证请求的来源。
  • PAM_AUTHTOK

    • 认证令牌(通常是密码)。除 pam_sm_authenticate(3)和 pam_sm_chauthtok(3)外,所有模块功能都应忽略此令牌。在前一个功能中,它用于将最新的身份验证令牌从一个堆叠模块传递到另一个模块。在后一种功能中,令牌用于其他目的。它包含当前活动的身份验证令牌。
  • PAM_OLDAUTHTOK

    • 旧的身份验证令牌。除 pam_sm_chauthtok(3)之外的所有模块功能均应忽略此令牌。
  • PAM_CONV

    • pam_conv 结构。参见 pam_conv(3)。

以下附加项目特定于 Linux-PAM,不应在可移植应用程序中使用:

  • PAM_FAIL_DELAY

    • 用于重定向集中 Management 的故障延迟的函数指针。参见 pam_fail_delay(3)。
  • PAM_XDISPLAY

    • X 显示的名称。对于基于 X 的图形应用程序,此项的值应为* $ DISPLAY 变量。此值可以独立于 PAM_TTY *使用,以传递显示名称。
  • PAM_XAUTHDATA

    • 指向包含 X 认证数据的结构的指针,该数据需要与* PAM_XDISPLAY *指定的显示器构建连接(如果需要)。请参阅 pam_xauth_data(3)。
  • PAM_AUTHTOK_TYPE

    • 默认操作是模块在请求密码时使用以下提示:“ New UNIX password:”和“ Retype UNIX password:”。示例词* UNIX *可以替换为该项目,默认情况下为空。 pam_get_authtok(3)使用此项目。

如果服务模块希望获取用户名,则不应使用此功能,而应执行对 pam_get_user(3)的调用。

仅服务模块有权读取身份验证令牌 PAM_AUTHTOK 和 PAM_OLDAUTHTOK。

3.1.4.2. 返回值

  • PAM_BAD_ITEM

    • 应用程序试图设置一个未定义或不可访问的项目。
  • PAM_BUF_ERR

    • 内存缓冲区错误。
  • PAM_PERM_DENIED

      • item *的值为 NULL。
  • PAM_SUCCESS

    • 数据更新成功。
  • PAM_SYSTEM_ERR

    • 作为第一个参数传递的* pam_handle_t *无效。

3.1.5. 描述 PAM 错误代码的字符串

#include <security/pam_appl.h> 
   const char *pam_strerror( 
   pamh,  
   errnum); 
 pam_handle_t *pamh; 
 int errnum; 

3.1.5.1. DESCRIPTION

pam_strerror函数返回一个指针,该指针指向描述在参数* errnum *中传递的错误代码的字符串,可能使用当前语言环境的 LC_MESSAGES 部分来选择适当的语言。该字符串不得由应用程序修改。没有库函数将修改此字符串。

3.1.5.2. 返回值

此函数始终返回指向字符串的指针。

3.1.6. 请求失败延迟

#include <security/pam_appl.h> 
   int pam_fail_delay( 
   pamh,  
   usec); 
 pam_handle_t *pamh; 
 unsigned int usec; 

3.1.6.1. DESCRIPTION

pam_fail_delay函数提供了一种机制,应用程序或模块可通过该机制建议* usec *微秒的最小延迟。该功能记录该功能请求的最长时间。如果 pam_authenticate(3)失败,则失败的返回到应用程序的时间将延迟大约此最长值随机分布的时间(最多 50%)。

与成功无关,当 PAM 服务模块将控制权返回给应用程序时,延迟时间重置为其默认值零。延迟发生在所有身份验证模块被调用之后,但是在控制返回给服务应用程序之前。

使用此功能时,程序员应检查其是否可用于:

#ifdef HAVE_PAM_FAIL_DELAY
    ....
#endif /* HAVE_PAM_FAIL_DELAY */

对于本质上是事件驱动的用单线程编写的应用程序,可能不希望产生此延迟。相反,应用程序可能希望以其他方式注册延迟。例如,在一个服务于来自单个事件循环的多个身份验证请求的单线程服务器中,应用程序可能想要简单地将给定连接标记为已阻止,直到应用程序计时器到期。因此,可以使用* PAM_FAIL_DELAY *项目更改延迟功能。可以分别使用 pam_get_item(3)和 pam_set_item(3)进行查询和设置。用于设置它的值应该是以下原型的函数指针:

void (*delay_fn)(int retval, unsigned usec_delay, void *appdata_ptr);

参数是模块栈的* retval 返回码,libpam 请求的 usec_delay 微秒延迟以及应用程序与当前 pamh 关联的 appdata_ptr *。最后一个值是由应用程序在调用 pam_start(3)或显式使用 pam_set_item(3)时设置的。

请注意,默认情况下,PAM_FAIL_DELAY 项设置为 NULL。这表明,当身份验证失败并且建议了延迟时,PAM 应该执行如上所述的随机延迟。如果应用程序不希望 PAM 库在身份验证失败时执行任何延迟,则该应用程序必须定义一个不执行任何语句的自定义延迟函数,并将 PAM_FAIL_DELAY 项设置为指向此函数。

3.1.6.2. 返回值

  • PAM_SUCCESS

    • 延迟已成功调整。
  • PAM_SYSTEM_ERR

    • NULL 指针被提交为 PAM 句柄。

3.1.7. 验证用户

#include <security/pam_appl.h> 
   int pam_authenticate( 
   pamh,  
   flags); 
 pam_handle_t *pamh; 
 int flags; 

3.1.7.1. DESCRIPTION

pam_authenticate功能用于验证用户。要求用户根据身份验证服务提供身份验证令牌,通常这是密码,但也可以是指纹。

PAM 服务模块可以请求用户通过对话机制 Importing 其用户名(请参阅 pam_start(3)和 pam_conv(3))。通过身份验证的用户名将出现在 PAM 项 PAM_USER 中。可以通过调用 pam_get_item(3)来恢复该项目。

  • pamh *参数是通过先前调用 pam_start()获得的身份验证句柄。 flags 参数是二进制值或以下值的零个或多个:
  • PAM_SILENT

    • 不要发出任何消息。
  • PAM_DISALLOW_NULL_AUTHTOK

    • 如果用户没有注册的身份验证令牌,则 PAM 模块服务应返回 PAM_AUTH_ERR。

3.1.7.2. 返回值

  • PAM_ABORT

    • 在首先调用 pam_end(3)之后,应用程序应立即退出。
  • PAM_AUTH_ERR

    • 用户未通过身份验证。
  • PAM_CRED_INSUFFICIENT

    • 由于某些原因,应用程序没有足够的凭据来验证用户身份。
  • PAM_AUTHINFO_UNAVAIL

    • 模块无法访问身份验证信息。这可能是由于网络或硬件故障等引起的。
  • PAM_MAXTRIES

    • 一个或多个身份验证模块已达到尝试对用户进行身份验证的限制。不要再试一次。
  • PAM_SUCCESS

    • 用户已成功认证。
  • PAM_USER_UNKNOWN

    • 身份验证服务未知的用户。

3.1.8. 设置用户凭证

#include <security/pam_appl.h> 
   int pam_setcred( 
   pamh,  
   flags); 
 pam_handle_t *pamh; 
 int flags; 

3.1.8.1. DESCRIPTION

pam_setcred功能用于构建,维护和删除用户的凭据。在对用户进行身份验证之后以及在为用户打开会话之前(使用 pam_open_session(3)),应调用它来设置凭据。会话关闭后,应删除凭据(使用 pam_close_session(3))。

凭证是用户拥有的东西。它是某些属性,例如* Kerberos 票证或补充组成员身份,这些属性构成给定用户的唯一性。在 Linux 系统上,用户的 UID GID *也是凭据。但是,已经确定这些属性(以及用户所属的默认补充组)是应由应用程序而不是 PAM 直接设置的凭据。此类凭据应在调用此功能之前由应用程序构建。例如,应已执行 initgroups(2)(或等效操作)。

有效的* flags(可以与PAM_SILENT进行逻辑或运算)是:

  • PAM_ESTABLISH_CRED

    • 初始化用户的凭据。
  • PAM_DELETE_CRED

    • 删除用户的凭据。
  • PAM_REINITIALIZE_CRED

    • 完全重新初始化用户的凭据。
  • PAM_REFRESH_CRED

    • 延长现有凭证的寿命。

3.1.8.2. 返回值

  • PAM_BUF_ERR

    • 内存缓冲区错误。
  • PAM_CRED_ERR

    • 设置用户凭证失败。
  • PAM_CRED_EXPIRED

    • 用户凭证已过期。
  • PAM_CRED_UNAVAIL

    • 无法检索用户凭据。
  • PAM_SUCCESS

    • 数据已成功存储。
  • PAM_SYSTEM_ERR

    • NULL 指针被提交为 PAM 句柄,该函数已被模块调用,或者发生了另一个系统错误。
  • PAM_USER_UNKNOWN

    • 身份验证模块未知用户。

3.1.9. 帐户验证 Management

#include <security/pam_appl.h> 
   int pam_acct_mgmt( 
   pamh,  
   flags); 
 pam_handle_t *pamh; 
 int flags; 

3.1.9.1. DESCRIPTION

pam_acct_mgmt函数用于确定用户帐户是否有效。它检查身份验证令牌和帐户到期并验证访问限制。通常在用户通过身份验证后调用。

  • pamh *参数是通过先前调用 pam_start()获得的身份验证句柄。 flags 参数是二进制值或以下值的零个或多个:
  • PAM_SILENT

    • 不要发出任何消息。
  • PAM_DISALLOW_NULL_AUTHTOK

    • 如果用户具有空身份验证令牌,则 PAM 模块服务应返回 PAM_NEW_AUTHTOK_REQD。

3.1.9.2. 返回值

  • PAM_ACCT_EXPIRED

    • 用户帐户已过期。
  • PAM_AUTH_ERR

    • Authentication failure.
  • PAM_NEW_AUTHTOK_REQD

    • 该用户帐户有效,但其身份验证令牌为* expired *。对此返回值的正确响应是要求用户在获得服务之前满足pam_chauthtok()功能。某些应用程序可能无法执行此操作。在这种情况下,应拒绝用户访问权限,直到他们可以更新密码为止。
  • PAM_PERM_DENIED

    • Permission denied.
  • PAM_SUCCESS

    • 身份验证令牌已成功更新。
  • PAM_USER_UNKNOWN

    • 密码服务未知的用户。

3.1.10. 更新身份验证令牌

#include <security/pam_appl.h> 
   int pam_chauthtok( 
   pamh,  
   flags); 
 pam_handle_t *pamh; 
 int flags; 

3.1.10.1. DESCRIPTION

pam_chauthtok函数用于更改给定用户的身份验证令牌(如与句柄* pamh *关联的状态所示)。

  • pamh *参数是通过先前调用 pam_start()获得的身份验证句柄。 flags 参数是二进制值或以下值的零个或多个:
  • PAM_SILENT

    • 不要发出任何消息。
  • PAM_CHANGE_EXPIRED_AUTHTOK

    • 此参数向模块指示仅当用户的身份验证令牌(密码)已过期时才应对其进行更改。如果未传递此参数,则应用程序要求更改所有身份验证令牌。

3.1.10.2. 返回值

  • PAM_AUTHTOK_ERR

    • 模块无法获取新的身份验证令牌。
  • PAM_AUTHTOK_RECOVERY_ERR

    • 模块无法获取旧的身份验证令牌。
  • PAM_AUTHTOK_LOCK_BUSY

    • 一个或多个模块无法更改身份验证令牌,因为它当前处于锁定状态。
  • PAM_AUTHTOK_DISABLE_AGING

    • 至少其中一个模块的身份验证令牌老化已禁用。
  • PAM_PERM_DENIED

    • Permission denied.
  • PAM_SUCCESS

    • 身份验证令牌已成功更新。
  • PAM_TRY_AGAIN

    • 并非所有模块都可以更新身份验证令牌。在这种情况下,不会更新用户的身份验证令牌。
  • PAM_USER_UNKNOWN

    • 密码服务未知的用户。

3.1.11. 开始 PAM 会话 Management

#include <security/pam_appl.h> 
   int pam_open_session( 
   pamh,  
   flags); 
 pam_handle_t *pamh; 
 int flags; 

3.1.11.1. DESCRIPTION

pam_open_session函数为先前成功通过身份验证的用户设置用户会话。稍后应通过调用 pam_close_session(3)终止会话。

应该注意的是,有效的 uid,geteuid(2)。应具有足够的特权来执行诸如创建或安装用户主目录之类的任务。

flags 参数是二进制值或以下值的零个或多个:

  • PAM_SILENT

    • 不要发出任何消息。

3.1.11.2. 返回值

  • PAM_ABORT

    • General failure.
  • PAM_BUF_ERR

    • 内存缓冲区错误。
  • PAM_SESSION_ERR

    • Session failure.
  • PAM_SUCCESS

    • 会话创建成功。

3.1.12. 终止 PAM 会话 Management

#include <security/pam_appl.h> 
   int pam_close_session( 
   pamh,  
   flags); 
 pam_handle_t *pamh; 
 int flags; 

3.1.12.1. DESCRIPTION

pam_close_session函数用于指示已认证的会话已结束。该会话应已通过调用 pam_open_session(3)创建。

应该注意的是,有效的 uid,geteuid(2)。应具有足够的特权来执行诸如卸载用户主目录之类的任务。

flags 参数是二进制值或以下值的零个或多个:

  • PAM_SILENT

    • 不要发出任何消息。

3.1.12.2. 返回值

  • PAM_ABORT

    • General failure.
  • PAM_BUF_ERR

    • 内存缓冲区错误。
  • PAM_SESSION_ERR

    • Session failure.
  • PAM_SUCCESS

    • 会话已成功终止。

3.1.13. 设置或更改 PAM 环境变量

#include <security/pam_appl.h> 
   int pam_putenv( 
   pamh,  
   name_value); 
 pam_handle_t *pamh; 
 const char *name_value; 

3.1.13.1. DESCRIPTION

pam_putenv函数用于添加或更改与* pamh *句柄关联的 PAM 环境变量的值。

  • pamh *参数是通过先前调用 pam_start()获得的身份验证句柄。 * name_value *参数是单个 NUL 终止的字符串,具有以下形式之一:
  • NAME =变量值

    • 在这种情况下,给定 NAME 的环境变量将设置为指示的值:* variable 的值*。如果该变量是已知的,它将被覆盖。否则,它将被添加到 PAM 环境中。
  • NAME=

    • 此函数将变量设置为空值。单独列出以表明这是实现此设置的正确方法。
  • NAME

    • 如果没有'=',则pam_putenv()函数将从 PAM 环境中删除相应的变量。

pam_putenv()对* name_value *的副本进行操作,这意味着与 putenv(3)相比,应用程序负责释放数据。

3.1.13.2. 返回值

  • PAM_PERM_DENIED

    • 给定参数* name_value *是一个 NULL 指针。
  • PAM_BAD_ITEM

    • 当前未设置请求的变量(用于删除)。
  • PAM_ABORT

      • pamh *句柄已损坏。
  • PAM_BUF_ERR

    • 内存缓冲区错误。
  • PAM_SUCCESS

    • 环境变量已成功更新。

3.1.14. 获取一个 PAM 环境变量

#include <security/pam_appl.h> 
   const char *pam_getenv( 
   pamh,  
   name); 
 pam_handle_t *pamh; 
 const char *name; 

3.1.14.1. DESCRIPTION

pam_getenv函数在与句柄* pamh 关联的 PAM 环境列表中搜索与 name *所指向的字符串匹配的项,并返回指向环境变量值的指针。该应用程序不允许释放数据。

3.1.14.2. 返回值

pam_getenv函数在失败时返回 NULL。

3.1.15. 获取 PAM 环境

#include <security/pam_appl.h> 
   char **pam_getenvlist( 
   pamh); 
 pam_handle_t *pamh; 

3.1.15.1. DESCRIPTION

pam_getenvlist函数返回与句柄* pamh *关联的 PAM 环境的完整副本。 PAM 环境变量表示授予服务时已认证用户的常规环境变量的内容。

内存的格式是 malloc()的 char 指针数组,其最后一个元素设置为 NULL。该数组中的每个非 NULL 条目都指向一个 NUL 终止且 malloc()的 char 字符串,其形式为“ * name = value *”。

应该注意的是,此内存永远不会由 libpam 释放。一旦通过调用pam_getenvlist获得,调用应用程序有责任释放()该内存。

返回的数组的格式和内容是设计使然,而不是巧合,与 execle(3)函数调用的第三个参数所需的格式和内容相匹配。

3.1.15.2. 返回值

pam_getenvlist函数在失败时返回 NULL。