【发布时间】:2020-12-08 20:13:05
【问题描述】:
我在检索 Red Hat Enterprise 6 的当前用户信息时遇到问题,其中用户是 LDAP 用户?
我有一些代码(实际上是安装工具的一部分)需要检索用户名、主目录和其他详细信息。它使用 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 问题?
附加:Basile Starynkevitch 要求的 /etc/nsswitch.conf(已删除注释行):
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....
【问题讨论】:
-
显示您的
/etc/nsswitch.conf文件。 -
我将其添加到问题中。
-
我也有同样的问题。就我而言,二进制文件是 32 位编译的,并在 64 位机器上运行。如果我尝试使用 perl 它可以工作: perl -e 'my $uid = $
-
您好,如果您在 64 位“cc -m64”中编译您的示例代码并在 32 位“cc -m32”中编译相同的代码,则该问题仅在 32 位版本上出现。
标签: linux ldap redhat getpwuid