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

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

int ret = pam_authenticate(pamh, PAM_DISALLOW_NULL_AUTHTOK);

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

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

3 ответа

Поскольку программа будет работать внутри, вы можете определить, существует ли имя пользователя, прочитав /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. В противном случае, это связано с бэкэндом.

Другие вопросы по тегам