加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – getpwuid()为LDAP用户返回NULL

发布时间:2020-12-14 01:01:10 所属栏目:Linux 来源:网络整理
导读:我在检索用户是LDAP用户的Red Hat Enterprise 6的当前用户信息时遇到问题? 我有一些代码(实际上是安装工具的一部分),需要检索用户名,主目录和其他详细信息.它使用getpwuid()调用来根据用户ID执行此操作.简化细分: uid_t uid = getuid();printf("UID = %dn
我在检索用户是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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读