linux – getpwuid()为LDAP用户返回NULL
我在检索用户是LDAP用户的Red Hat Enterprise 6的当前用户信息时遇到问题?
我有一些代码(实际上是安装工具的一部分),需要检索用户名,主目录和其他详细信息.它使用getpwuid()调用来根据用户ID执行此操作.简化细分: uid_t uid = getuid(); printf("UID = %dn",uid); errno = 0; struct passwd* udetails = getpwuid(uid); if (udetails != NULL) { printf("User name = %sn",udetails->pw_name); } else { printf("getpwuid returns NULL,errno=%dn",errno); } 如果用户是本地用户(在该系统的/ etc / passwd中),则可以正常工作. 当用户是一个LDAP认证的用户,该呼叫的的getuid返回用户ID或当前用户,而是getpwuid返回0,在设置errno没有错误代码呼叫.根据文档,这意味着用户不存在. 这有用吗?根据getpwuid手册页: 的getpwnam()函数返回一个指针,指向包含该记录的断开的字段在密码数据库中的结构(例如,本地密码文件/ etc / passwd中,NIS和LDAP)相匹配的用户名的名称. getpwuid()函数返回一个指向结构的指针,该结构包含密码数据库中与用户ID uid匹配的记录的分支字段. 如果当前用户已通过LDAP验证,是否需要另外的调用来获取详细信息?是否有必要在应用程序中打开LDAP数据库,还是系统调用应该处理? 附加:我现在也在RHEL 5机箱上尝试了这个,对同一个LDAP目录进行身份验证.这可能只是RHEL 6盒子上的配置问题吗?还是更广泛的RHEL 6问题? 附加:/etc/nsswitch.conf按照Basile Starynkevitch的要求(删除了注释行): passwd: files sss shadow: files sss group: files sss hosts: files dns bootparams: nisplus [NOTFOUND=return] files ethers: files netmasks: files networks: files protocols: files rpc: files services: files sss netgroup: files sss publickey: nisplus automount: files ldap aliases: files nisplus 我猜其中一些应该在某些时候提到ldap?事实上,这表明它根本不使用LDAP …. 解决方法
问题似乎是缺少32位的nss_sss库(在我的例子中).我认为对于redhat来说它是rpm包:sssd-client.i686.rpm
我使用了以下makefile: all: getpwuid_bug-32bit getpwuid_bug-64bit getpwuid_bug-32bit: getpwuid_bug.c makefile $(CC) -Wall -m32 -o $@ $< getpwuid_bug-64bit: getpwuid_bug.c makefile $(CC) -Wall -m64 -o $@ $< 以及以下getpwuid_bug.c #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <sys/types.h> #include <unistd.h> #include <pwd.h> int main(argc,argv) int argc; char **argv; { uid_t uid; struct passwd *udetails; uid = getuid(); printf("UID = %dn",uid); errno = 0; udetails = getpwuid(uid); if (udetails != NULL) { printf("User name = %sn",udetails->pw_name); } else { printf("getpwuid returns NULL,errno); return 1; } return 0; } 现在输入make … 然后运行两个 $./getpwuid_bug-32bit UID = 1234 getpwuid returns NULL,errno=0 $./getpwuid_bug-64bit UID = 1234 User name = krico $ 然后,如果您对该程序的两个版本进行了分析,您将看到64位版本立即找到nss_sss open("/lib64/libnss_sss.so.2",O_RDONLY) = 3 在经历了许多这样的事情之后32位的失败了: open("/lib/tls/i686/sse2/libnss_sss.so.2",O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/lib/tls/i686/sse2",0xfffef338) = -1 ENOENT (No such file or directory) open("/lib/tls/i686/libnss_sss.so.2",O_RDONLY) = -1 ENOENT (No such file or directory) 所以,我的结论是您需要使用该32位版本的库安装一些rpm(例如sssd-client.i686.rpm) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |