PAM:pam_get_authtok 返回 PAM_BAD_ITEM

PAM:pam_get_authtok 返回 PAM_BAD_ITEM

我正在尝试编写自己的 PAM 模块:

int pam_sm_setcred(pam_handle_t* handle, int flags, int argc, const char** argv)
{
     return PAM_SUCCESS;
}

int pam_sm_acct_mgmt(pam_handle_t* handle, int flags, int argc, const char** argv)
{
     return PAM_SUCCESS;
}

int pam_sm_authenticate(pam_handle_t* handle, int flags, int argc, const char** argv)
{
     ...

     retval = pam_get_user(handle, &username, "Username: ");
     if (retval != PAM_SUCCESS)
     {
          return retval;
     }

     passwd = getpwnam(username);
     if (!passwd)
     {
          return PAM_USER_UNKNOWN;
     }

     retval = pam_get_authtok(handle, PAM_AUTHTOK, &password, "Password: ");
     if (retval != PAM_SUCCESS)
     {
          return retval;
     }

     printf("Welcome to Hell, %s : %s\n", username, password);
     return PAM_SUCCESS;
}

当我将 .so 库放入 /lib/security 并在 pam 文件(/etc/pam.d/common-auth)顶部添加这些行时,它就可以工作:

auth sufficient mypam.so
account sufficient mypam.so

例如:当我尝试在 sudo 下打开某些文件时,它工作正常。

但我也尝试编写小型可执行测试:

int main(...)
{
     pam_conv conv = {misc_conv, NULL};
     pam_start("test", NULL, &conv, &handle);
     pam_sm_authenticate(handle, 0, 0, NULL);
     ...
}

在这种情况下,当执行到 时pam_get_authtok(...),它返回错误代码 29 (PAM_BAD_ITEM)。

我究竟做错了什么?

相关内容