Aby zrozumieć, jak os.getuid
i os.geteuid
różnią, trzeba zrozumieć, że oni nie są specyficzne funkcje Pythona (inne niż prefiksu modułu os
). Te funkcje są opakowaniem wywołań systemowych getuid
i geteuid
, które są dostarczane przez zasadniczo wszystkie systemy operacyjne podobne do systemu Unix.
Zamiast więc patrzeć na dokumenty Pythona (które prawdopodobnie nie podają wielu szczegółów), należy zapoznać się z dokumentami dla systemu operacyjnego. Here jest odpowiednią dokumentacją dla systemu Linux, na przykład. Wikipedia ma również dobre article on Unix User IDs.
Różnica między zwykłym UID a skutecznym UID polega na tym, że tylko EUID jest sprawdzany, gdy robisz coś, co wymaga specjalnego dostępu (takiego jak odczyt lub zapis pliku lub wykonywanie określonych wywołań systemowych). Identyfikator UID wskazuje rzeczywistego użytkownika, który wykonuje akcję, ale (zwykle) nie jest brany pod uwagę podczas sprawdzania uprawnień. W normalnych programach będą takie same. Niektóre programy zmieniają swoje identyfikatory EUID, aby dodawać lub odejmować od działań, które mogą wykonać. Mniejsza liczba również zmienia ich UID, aby skutecznie "stać się" innym użytkownikiem.
Oto przykład programu, który zmienia swój EUID: program passwd
(który służy do zmiany hasła) musi zapisać w pliku haseł systemu, który jest własnością użytkownika root. Zwykli użytkownicy nie mogą zapisywać do tego pliku, ponieważ gdyby mogli, mogliby również zmienić hasło wszystkich innych użytkowników. Aby rozwiązać ten problem, program passwd
ma ustawiony bit w swoich uprawnieniach do pliku (znany jako setuid bit
), który wskazuje systemowi operacyjnemu, że powinien on działać z identyfikatorem EUID właściciela programu (np. root
), nawet jeśli jest uruchamiany przez innego użytkownika . Program passwd
wyświetliłby wtedy swoją nazwę użytkownika UID
, a EUID jako root. Zapis do pliku haseł systemowych wymaga uprzywilejowania identyfikatora EUID. Identyfikator UID również jest przydatny, ponieważ passwd
musi wiedzieć, dla którego użytkownika zmienia hasło.
Jest kilka innych przypadków, w których identyfikatory UID i EUID nie będą pasować, ale nie są zbyt częste. Na przykład serwer plików działający jako superużytkownik może zmienić swój identyfikator EUID tak, aby był zgodny z określonym użytkownikiem żądającym manipulacji plikami. Korzystanie z identyfikatora użytkownika EUID pozwala serwerowi unikać dostępu do rzeczy, których użytkownik nie może dotknąć.
Nie są one takie same w programach setuid (i mogą być różne dla dowolnego programu działającego jako root i wywołującego seteuid jawnie). Oznacza to, że * są * takie same podczas uruchamiania skryptu. –