2

I am authenticating a user and I want to determine if the user is known (a valid existing username) or unknown.

int ret = pam_authenticate(pamh, PAM_DISALLOW_NULL_AUTHTOK);

Now even if the username is unknown, pam_authenticate returns PAM_AUTH_ERR instead of (expected) PAM_USER_UNKNOWN.

How to find if the username is known or not?

4

3 回答 3

3

由于程序将在内部运行,因此您可以通过读取来检测用户名是否存在/etc/passwd。文件的第一个条目是用户名。由于 EJP 指出的原因,PAM 本身不知道用户名是否存在。

于 2013-11-08T15:43:46.083 回答
2

鲁本的回答是正确的,但我没有直接从/etc/passwdOR读取/etc/shadow,而是使用了 linux 函数getpwnamgetspnam,它们为你做同样的工作。

于 2013-11-13T13:23:41.563 回答
0

此处的结果取决于您的系统使用的后端的结果。这些后端及其顺序在 /etc/nsswitch.conf 中设置

它们的形式为:

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

其中“MODNAME”对应于位于 :( /lib64/security/pam_MODNAME.so或 /lib/security 对于 32 位系统)中的文件。

Modname 可以是类似compatldap任何与网络相关的数据库。

您将在 pam_authenticate 中获得的结果取决于您的配置/etc/pam.d/ 和您的/etc/nsswitch.conf配置。

如果您在“passwd”部分中有“文件”以外的任何内容,请尝试删除辅助后端(但要注意保留恢复它的方法)。

如果只有“文件”数据库(witch 对应于 /etc/passwd 和 /etc/shadow),您仍然没有得到“PAM_USER_UNKNOWN”,它肯定与 PAM 相关。否则,它与后端相关。

于 2013-11-12T08:38:37.713 回答