簡體   English   中英

getpwuid() 為 LDAP 用戶返回 NULL

[英]getpwuid() returns NULL for LDAP user

我在檢索 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 問題?

附加: /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

我使用了以下生成文件:

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
$

然后如果你對程序的兩個版本都進行了跟蹤,你會看到 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)

我有一個類似的問題,我試圖在 x64 debian(也嘗試過 Ubuntu)上運行 Teamviewer9。 它不適用於活動目錄域中的帳戶,Teamviewer 崩潰,因為 getpwuid() 返回 null。 我解決了安裝 nscd,如ubuntu bug 中所述

我花了很多時間來解決這個問題......

我在 CentOS 8 上遇到了完全相同的問題。@kriko 的回答幫我解決了這個問題,但我必須yum install nss_nis.i686才能修復它。 不是sssd-client.i686

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM