【发布时间】:2014-03-25 15:37:32
【问题描述】:
我在网上找到了一段代码,似乎是一个很好的例子——http://www.freebsd.org/doc/en/articles/pam/article.html#pam-sample-appl
不幸的是,它无法正确处理需要在首次登录时更改密码的帐户。
当我su - user(来自非 root 帐户)时,我被正确地要求输入密码,然后更改密码。
当我运行我的程序时,我被要求输入密码,但是很遗憾,我没有要求更改密码,并且在代码内部我没有任何迹象表明会有这样的需要。
问题出在哪里?
PAM 调试只显示了这个:
Mar 25 11:27:33 S-78 pam: pam_unix(su:auth): authentication failure; logname=greg uid=502 euid=502 tty=/dev/pts/4 ruser=greg rhost=SIR-78 user=tg
下图程序的输出是这样的:
-bash-3.2$ ./pam tg
Password:
pam_authenticate = 7
pam_acct_mgmt = 0
Sorry - pam_err = 17
以下是部分修改后的代码:
pam_start("su", user, &pamc, &pamh);
/* set some items */
gethostname(hostname, sizeof(hostname));
if ((pam_err = pam_set_item(pamh, PAM_RHOST, hostname)) != PAM_SUCCESS)
goto pamerr;
user = getlogin();
if ((pam_err = pam_set_item(pamh, PAM_RUSER, user)) != PAM_SUCCESS)
goto pamerr;
tty = ttyname(STDERR_FILENO);
if ((pam_err = pam_set_item(pamh, PAM_TTY, tty)) != PAM_SUCCESS)
goto pamerr;
/* authenticate the applicant */
if ((pam_err = pam_authenticate(pamh, 0)) != PAM_SUCCESS)
{
printf( "pam_authenticate = %d\n", ( int )pam_err ) ; /* returns error 7 - PAM_AUTH_ERR */
pam_err = pam_acct_mgmt(pamh, 0) ;
printf( "pam_acct_mgmt = %d\n", ( int )pam_err ) ; /* returns no error! */
}
/* establish the requested credentials */
if ((pam_err = pam_setcred(pamh, PAM_ESTABLISH_CRED)) != PAM_SUCCESS) /* returns error 17 - PAM_CRED_ERR */
goto pamerr;
上面的程序使用了从这里复制的对话功能:http://www.freebsd.org/doc/en/articles/pam/article.html#pam-sample-conv
我还使用了在security/pam_misc.h 中声明的misc_conv,并在-lpam_misc 中可用,但我得到了相同的结果 - 没有要求更改密码或没有迹象表明需要更改密码。
知道我该如何解决吗? 如果我删除对话功能,我会得到同样的错误,除了没有提示输入密码。
【问题讨论】: