2013-09-02 26 views
5

Tôi đang gặp sự cố khi truy xuất thông tin người dùng hiện tại của Red Hat Enterprise 6 nơi người dùng là người dùng LDAP?getpwuid() trả về NULL cho người dùng LDAP

Tôi có một số mã (thực sự là một phần của công cụ cài đặt) cần truy xuất tên người dùng, thư mục chính và các chi tiết khác. Nó đang sử dụng lệnh getpwuid() để thực hiện điều này dựa trên id người dùng. Phân tích được đơn giản hóa:

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); 
} 

Thao tác này không có vấn đề khi người dùng là người dùng cục bộ (trong/etc/passwd của hệ thống).

Khi người dùng là người dùng được xác thực LDAP, cuộc gọi getuid trả về ID người dùng hoặc người dùng hiện tại, nhưng lệnh gọi getpwuid trả về 0, không có mã lỗi được đặt trong errno. Theo tài liệu, điều này có nghĩa là người dùng không tồn tại.

Công việc này có nên không? Theo manpage getpwuid:

Hàm getpwnam() trả về một con trỏ đến một cấu trúc chứa các trường bị hỏng của bản ghi trong cơ sở dữ liệu mật khẩu (ví dụ, tệp mật khẩu cục bộ/etc/passwd, NIS và LDAP) khớp với tên người dùng.

Hàm getpwuid() trả về một con trỏ tới cấu trúc chứa trường bị hỏng của bản ghi trong cơ sở dữ liệu mật khẩu khớp với ID người dùng uid.

Có phải một cuộc gọi thay thế được yêu cầu để có được chi tiết nếu người dùng hiện tại đã được xác thực bởi LDAP không? Có cần thiết phải mở cơ sở dữ liệu LDAP trong một ứng dụng hay hệ thống xử lý cuộc gọi đó không?

Bổ sung: Tôi hiện cũng đã thử tính năng này trên hộp RHEL 5 xác thực dựa trên cùng một thư mục LDAP. Có thể đây chỉ là một vấn đề cấu hình trên hộp RHEL 6? Hoặc một vấn đề RHEL 6 rộng hơn?

bổ sung: /etc/nsswitch.conf theo yêu cầu của Basile Starynkevitch (dòng nhận xét loại bỏ):

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 

Tôi đoán rằng một số trong những nên đề cập đến ldap tại một số điểm? Trên thực tế, điều này gợi ý rằng nó không sử dụng LDAP chút nào ....

+0

Hiển thị tệp '/ etc/nsswitch.conf' của bạn. –

+0

Tôi đã thêm nó vào câu hỏi. – dtopham75

+0

Tôi có cùng một vấn đề. Trong trường hợp của tôi nhị phân được biên dịch 32 bit và chạy trên một máy 64bit. Nếu tôi thử với perl nó hoạt động: perl -e 'my $ uid = $ <; in "UID:". $ uid. "\ n"; my @all = getpwuid ($ uid); in "TẤT CẢ:". tham gia (",", @all). "\ n" nếu vô hướng (@all); ' – krico

Trả lời

3

Sự cố có vẻ thiếu nss_sss thư viện cho 32 bit (trong trường hợp của tôi). Tôi nghĩ rằng cho redhat nó là gói rpm: sssd-client.i686.rpm

tôi đã sử dụng makefile sau:

all: getpwuid_bug-32bit getpwuid_bug-64bit 

getpwuid_bug-32bit: getpwuid_bug.c makefile 
     $(CC) -Wall -m32 -o [email protected] $< 

getpwuid_bug-64bit: getpwuid_bug.c makefile 
     $(CC) -Wall -m64 -o [email protected] $< 

và getpwuid_bug.c sau

#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; 
} 

Bây giờ gõ làm ...

Sau đó chạy cả hai

$ ./getpwuid_bug-32bit 
UID = 1234 
getpwuid returns NULL, errno=0 
$ ./getpwuid_bug-64bit 
UID = 1234 
User name = krico 
$ 

Sau đó, nếu bạn strace cả các phiên bản của chương trình, bạn sẽ thấy rằng các phiên bản 64 bit thấy nss_sss imediately

open("/lib64/libnss_sss.so.2", O_RDONLY) = 3 

nơi như 32 bit một thất bại thảm hại sau khi thực hiện nhiều thao tác sau:

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) 

Vì vậy, kết luận của tôi là bạn cần cài đặt một số rpm với phiên bản 32 bit đó của thư viện (ví dụ: sssd-client.i686.rpm)

1

Tôi gặp vấn đề tương tự, tôi đã cố gắng chạy Teamviewer9 trên debian x64 (cũng đã thử Ubuntu). Nó không hoạt động cho các tài khoản trong một miền thư mục hoạt động, Teamviewer đã bị lỗi vì getpwuid() trả về null. Tôi đã giải quyết cài đặt nscd, như được mô tả trong số ubuntu bug này.

Tôi đã mất rất nhiều thời gian để sửa lỗi này ...

+0

Điều này giống như giải pháp chung khi bạn không thể tự biên dịch ứng dụng có vấn đề. – goe

Các vấn đề liên quan