[英]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.