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 ....
Hiển thị tệp '/ etc/nsswitch.conf' của bạn. –
Tôi đã thêm nó vào câu hỏi. – dtopham75
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