encontrou a isu em: link basicamente o problema é que er não pode obter o paswword de usuários desconhecidos, o Linux PAM substituirá a senha por "\ b \ n \ r \ 177INCORRECT" se não puder obter informações sobre o usuário nos bancos de dados do sistema (Name Service Switch, consulte man nsswitch.conf). possível verificação alternativa com getpawn que o usuário existe. exemplo:
/* The actual pam functions are merely wrappers around succeed_if */
PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv) {
const char * password=NULL;
struct passwd *pwd;
const char *user;
int pam_err=0;
/* identify user */
pam_err = pam_get_user(pamh, &user, NULL);
if (pam_err != PAM_SUCCESS)
{
return (pam_err);
}
if ((pwd = getpwnam(user)) == NULL)
{
return (PAM_USER_UNKNOWN);
}
/*note : if user is not deefined pawsword return will be "^H$^M^?INCORRECT^@" */
pam_err = pam_get_authtok(pamh, PAM_AUTHTOK, &password , NULL);
if (pam_err!=PAM_SUCCESS)
{
return (pam_err);
}
/*here add personal auhtentication */
pam_err = isAuthenticate((char *)user,(char *)password);
if (pam_err != PAM_OK)
{
return (PAM_AUTH_ERR);
}
return (PAM_SUCCESS);
}