Я аутентифицирую пользователя и хочу определить, известен ли он (действительное имя пользователя) или неизвестен.
int ret = pam_authenticate(pamh, PAM_DISALLOW_NULL_AUTHTOK);
Теперь, даже если имя пользователя неизвестно, pam_authenticate
возвращается PAM_AUTH_ERR
вместо (ожидается) PAM_USER_UNKNOWN
,
Как узнать, известно ли имя пользователя или нет?
Поскольку программа будет работать внутри, вы можете определить, существует ли имя пользователя, прочитав /etc/passwd
, Первая запись файла — это имя пользователя. Сам PAM не сообщает, существует ли имя пользователя по причинам, указанным EJP.
Ответ Рубена правильный, но вместо того, чтобы читать прямо из /etc/passwd
ИЛИ ЖЕ /etc/shadow
Я использовал функции Linux getpwnam а также getspnam которые делают ту же работу для вас.
Результат здесь зависит от результатов бэкэндов, используемых вашей системой.
Эти серверные части и их порядок установлены в /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. В противном случае, это связано с бэкэндом.