我正在编写一个非常简单的PAM身份验证函数,如下所示。
int authenticate(char* user, char* pass)
{
int value = pam_start("passwd", user, &conv, &pamh);
if (value == PAM_SUCCESS)
{
reply = (struct pam_response*)malloc(sizeof(struct pam_response));
reply[0].resp = pass;
reply[0].resp_retcode = 0;
value = pam_authenticate(pamh, 0);
if (value == PAM_SUCCESS)
{
// This call is seg faulting.
value = pam_acct_mgmt(pamh, 0);
return value;
}
else
printf("Failed on Authentication\n");
}
}
pam_end(pamh, value);
return value;
}
conv
定义如下:
int nullConv(int num_msg, const struct pam_message** msg, struct pam_response** resp,
void* appdata_ptr)
{
*resp = reply;
return PAM_SUCCESS;
}
static struct pam_conv conv = { nullConv, NULL };
这是一个非常简单的功能,大部分时间都可以使用。我正在开发一个Linux机器。当我弄乱用户帐户时,请说bob
并使用Maximum number of days between password change
使Number of days of warning before password expires
小于#chage -M 28 bob
#chage -W 29 bob
pam_acct_mgmt
应用程序在调用#chage -M 30 bob
时出错。如果我更改它以使最大数量大于警告前的数字,我的应用程序将按预期运行。
{{1}}。现在我很好,用户可以登录。
答案 0 :(得分:0)
我找到了以下帖子:
https://serverfault.com/questions/249671/switch-on-pam-debugging-to-syslog
并遵循公认的解决方案。我在/var/log/debug.log
文件中找到的结果显示pam_tally(system-auth:auth): unknown option: reset
我所指的PAM /etc/pam.d/system-auth
文件中的一行是一行
account required pam_tally.so reset
当我删除reset
选项时,一切正常。
顺便说一下,pam_vsyslog
有一个严重的错误。这是一个简单的strcmp
。