我發現,似乎是一個很好的例子,在互聯網上的一段代碼 - http://www.freebsd.org/doc/en/articles/pam/article.html#pam-sample-applPAM - 需要更改密碼時該怎麼辦?
可惜的是它不妥善處理需要在首次登錄密碼變更賬戶。 當我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
我也使用中聲明的misc_conv
,並在-lpam_misc
中可用,但我得到了相同的結果 - 沒有請求更改密碼或沒有指示,這將需要。
任何想法我怎麼解決它? 如果我刪除對話功能,我會得到相同的錯誤,除非沒有提示輸入密碼。