dto*_*m75 5 linux redhat ldap getpwuid
我在检索用户是LDAP用户的Red Hat Enterprise 6的当前用户信息时遇到问题?
我有一些代码(实际上是安装工具的一部分),需要检索用户名,主目录和其他详细信息.它使用getpwuid()调用来根据用户ID执行此操作.简化细分:
uid_t uid = getuid();
printf("UID = %d\n", uid);
errno = 0;
struct passwd* udetails = getpwuid(uid);
if (udetails != NULL)
{
    printf("User name = %s\n", udetails->pw_name);
}
else
{
    printf("getpwuid returns NULL, errno=%d\n", 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 = %d\n", uid);
  errno = 0;
  udetails = getpwuid(uid);
  if (udetails != NULL) {
    printf("User name = %s\n", udetails->pw_name);
  } else {
    printf("getpwuid returns NULL, errno=%d\n", errno);
    return 1;
  }
  return 0;
}
现在输入 make...
然后运行两者
$ ./getpwuid_bug-32bit
UID = 1234
getpwuid returns NULL, errno=0
$ ./getpwuid_bug-64bit
UID = 1234
User name = krico
$
然后如果你 strace 两个版本的程序,你会看到 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)
| 归档时间: | 
 | 
| 查看次数: | 5231 次 | 
| 最近记录: |