2013-02-19 20 views
18

Dokumentacja os.getuid() mówi:Czym różnią się os.getuid() i os.geteuid()?

Powrót użytkownik id bieżącego procesu jest.

I os.geteuid() mówi:

Zwraca efektywny identyfikator użytkownika bieżącego procesu.

Więc jaka jest różnica między idużytkownikiem i efektywny id użytkownika?

Dla mnie oba działają tak samo (zarówno dla 2.x, jak i 3.x). Używam go do sprawdzenia, czy skrypt jest uruchamiany jako root.

+0

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. –

Odpowiedz

40

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ąć.

6

Funkcja os.getuid() zwraca identyfikator użytkownika, który uruchamia twój program. Funkcja os.geteuid() użytkownika, z którego masz uprawnienia do używania programu. W większości przypadków będzie to to samo. Dobrze znany przypadek, w którym wartości te będą się różnić, to ustawienie bitu setuid dla pliku wykonywalnego programu, a użytkownik uruchamiający program różni się od użytkownika własnym plikiem wykonywalnym programu. W tym przypadku os.getuid() zwróci identyfikator użytkownika uruchamiającego program, natomiast os.geteuid() zwróci identyfikator użytkownika, który jest właścicielem pliku wykonywalnego programu.

+0

Czy potrafisz opracować część 'os.geteuid()'? Czy możesz podać przykład (y), aby pokazać, że oba nie są takie same, tzn. * X * można osiągnąć tylko przy pomocy getuid, a nie geteuid, a * y * można osiągnąć tylko za pomocą geteuid, a nie getuid? –

Powiązane problemy