Mam problemy z pobieraniem aktualnych informacji o użytkowniku Red Hat Enterprise 6, w którym użytkownik jest użytkownikiem LDAP?getpwuid() zwraca NULL dla użytkownika LDAP
Mam pewien kod (w rzeczywistości część narzędzia instalacyjnego), który musi pobrać nazwę użytkownika, katalog domowy i inne szczegóły. Korzysta z wywołania getpwuid(), aby to zrobić na podstawie identyfikatora użytkownika. Uproszczony podział:
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);
}
Działa to bez problemów, gdy użytkownik jest użytkownikiem lokalnym (w tym systemie/etc/passwd).
Gdy użytkownik jest użytkownikiem uwierzytelnionym przez LDAP, wywołanie getuid zwraca identyfikator użytkownika lub bieżącego użytkownika, ale wywołanie getpwuid zwraca 0, bez kodu błędu ustawionego w errno. Zgodnie z dokumentacją oznacza to, że użytkownik nie istnieje.
Czy to działa? Zgodnie ze stroną getpwuid:
Funkcja getpwnam() zwraca wskaźnik do struktury zawierającej wyrenderowane pola rekordu w bazie danych haseł (np. Lokalny plik haseł/etc/passwd, NIS i LDAP), który pasuje do nazwy użytkownika.
Funkcja getpwuid() zwraca wskaźnik do struktury zawierającej uszkodzone pola rekordu w bazie danych haseł, które są zgodne z identyfikatorem użytkownika ID.
Czy wymagane jest połączenie alternatywne, aby uzyskać szczegółowe informacje, jeśli bieżący użytkownik został uwierzytelniony przez LDAP? Czy konieczne jest otwarcie bazy danych LDAP w aplikacji lub czy wywołanie systemowe powinno ją obsłużyć?
Dodatkowo: Próbowałem tego również na pudełku RHEL 5 uwierzytelniającym się w tym samym katalogu LDAP. Czy to może być problem z konfiguracją na pudełku RHEL 6? Lub szerszy problem RHEL 6? (Usunięte linie z komentarzem) /etc/nsswitch.conf wymagane przez Basile Starynkevitch::
dodatkowe
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
Zgaduję, że niektóre z nich należy wspomnieć LDAP w pewnym momencie? W rzeczywistości sugeruje to, że wcale nie korzysta z protokołu LDAP ...
Pokaż swój plik '/ etc/nsswitch.conf'. –
Dodałem go do pytania. – dtopham75
Mam ten sam problem. W moim przypadku plik binarny został skompilowany 32-bitowo i działa na maszynie 64-bitowej. Jeśli spróbuję z perl, działa: perl -e 'my $ uid = $ <; wydrukuj "UID:". $ uid. "\ n"; my @all = getpwuid ($ uid); wydrukuj "ALL:". join (",", @all). "\ n" jeśli skalar (@all); ' – krico