首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >getpwuid()为LDAP用户返回NULL

getpwuid()为LDAP用户返回NULL
EN

Stack Overflow用户
提问于 2013-09-02 01:47:53
回答 3查看 7.2K关注 0票数 5

我在检索6的当前用户信息时遇到了问题,用户是LDAP用户吗?

我有一些代码(实际上是安装工具的一部分),需要检索用户名、主目录和其他细节。它使用getpwuid()调用来实现基于用户id的操作。简化的细目:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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手册页:

函数返回一个指向结构的指针,该结构包含密码数据库中记录的中断字段(例如,与用户名匹配的本地密码文件/etc/passwd、NIS和LDAP)。

函数返回一个指向结构的指针,该结构包含与用户ID uid匹配的密码数据库中记录的坏字段。

如果当前用户已通过LDAP进行身份验证,是否需要另一次调用才能获得详细信息?是否有必要在应用程序中打开LDAP数据库,还是应该由系统调用来处理?

附加:我现在也在一个RHEL 5框上尝试了这一点,它是针对同一个LDAP目录进行身份验证的。这是否只是RHEL 6盒上的配置问题?还是更广泛的RHEL 6?

附加: /etc/nsswitch.conf应Basile Starynkevitch的要求(注释行删除):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 .

EN

回答 3

Stack Overflow用户

发布于 2013-11-19 04:55:28

问题似乎是缺少了32位的nss_sss库(在我的例子中)。我想红帽是rpm包: sssd-client.i686.rpm

我使用了以下makefile:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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..。

那就同时运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ ./getpwuid_bug-32bit
UID = 1234
getpwuid returns NULL, errno=0
$ ./getpwuid_bug-64bit
UID = 1234
User name = krico
$

然后,如果您对程序的两个版本进行了绑定,您将看到64位版本立即找到了nss_sss。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
open("/lib64/libnss_sss.so.2", O_RDONLY) = 3

当32位在经历了其中的许多之后不幸地失败了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

票数 3
EN

Stack Overflow用户

发布于 2014-05-02 11:14:45

我有一个类似的问题,我试图在Teamviewer9上运行x64 debian (也尝试了Ubuntu)。它不适用于活动目录域中的帐户,Teamviewer崩溃是因为getpwuid()返回null。如本ubuntu错误所述,我解决了安装nscd的问题。

我花了很多时间才修好这个..。

票数 3
EN

Stack Overflow用户

发布于 2020-12-08 04:13:05

我在CentOS 8上也遇到了同样的问题,@kriko的回答帮助我解决了这个问题,但是为了解决这个问题,我不得不使用yum install nss_nis.i686。不是sssd-client.i686

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18570177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文