Как определить, известен ли пользователь или не использует pam_authenticate?

Я аутентифицирую пользователя и хочу определить, известен ли он (действительное имя пользователя) или неизвестен.

int ret = pam_authenticate(pamh, PAM_DISALLOW_NULL_AUTHTOK);

Теперь, даже если имя пользователя неизвестно, pam_authenticate возвращается PAM_AUTH_ERR вместо (ожидается) PAM_USER_UNKNOWN,

Как узнать, известно ли имя пользователя или нет?

1

Решение

Поскольку программа будет работать внутри, вы можете определить, существует ли имя пользователя, прочитав /etc/passwd , Первая запись файла — это имя пользователя. Сам PAM не сообщает, существует ли имя пользователя по причинам, указанным EJP.

3

Другие решения

Ответ Рубена правильный, но вместо того, чтобы читать прямо из /etc/passwd ИЛИ ЖЕ /etc/shadowЯ использовал функции Linux getpwnam а также getspnam которые делают ту же работу для вас.

1

Результат здесь зависит от результатов бэкэндов, используемых вашей системой.
Эти серверные части и их порядок установлены в /etc/nsswitch.conf

Они в форме:

passwd: files MODNAME
group:  files MODNAME
hosts:  files dns

Где «MODNAME» соответствует файлу, расположенному в:
/lib64/security/pam_MODNAME.so (или / lib / security для 32-битных систем).

Модмэйн может быть как то compat или же ldap или любая связанная с сетью база данных.

Результат, который вы получите в pam_authenticate, зависит от конфигурации вашего /etc/pam.d/ и ваш /etc/nsswitch.conf конфигурации.

Если у вас есть что-то кроме «file» в разделе «passwd», попробуйте удалить вторичный бэкэнд (но будьте осторожны, чтобы сохранить способ его восстановления).

Если только с базой данных «файлы» (которая соответствует / etc / passwd и / etc / shadow) вы все еще не получаете «PAM_USER_UNKNOWN», это определенно связано с PAM. В противном случае, это связано с бэкэндом.

0
По вопросам рекламы [email protected]