В чем разница между ОС.getuid () и os.geteuid()?

документация os.getuid() говорит:

возвращает идентификатор пользователя текущего процесса.

и os.geteuid() говорит:

возвращает эффективный идентификатор пользователя текущего процесса.

Так в чем разница между идентификатор пользователя и эффективный идентификатор пользователя?

для меня оба работают одинаково (на 2.x и 3.x). Я использую его, чтобы проверить, выполняется ли скрипт как корень.

2 ответов


чтобы понять, как os.getuid и os.geteuid different, вам нужно понять, что они не являются специфическими функциями Python (кроме os префикс модуля). Эти функции обертывают getuid и geteuid системные вызовы, предоставляемые практически всеми Unix-подобными операционными системами.

Итак, вместо того, чтобы смотреть на документы Python (которые вряд ли дадут много деталей), вы должны посмотреть документы для своей операционной системы. здесь - это например, соответствующая документация для Linux. Википедия также имеет хороший статья об идентификаторах пользователей Unix.

разница между обычным UID и эффективным UID заключается в том, что только EUID проверяется, когда вы делаете что-то, что требует специального доступа (например, чтение или запись файла или выполнение определенных системных вызовов). UID указывает фактического пользователя, который выполняет действие, но это (обычно) не учитывается при проверке разрешений. В обычных программах они будут такими же. Некоторые программы изменяют свой EUID, чтобы добавить или вычесть из действий, которые они могут предпринять. Меньшее число также изменяет свой UID, чтобы эффективно "стать" другим пользователем.

вот пример программы, которая изменяет свой EUID:passwd программа (которая используется для изменения пароля) должна записать в файл пароля системы, который принадлежит пользователю root. Обычные пользователи не могут писать в этот файл, так как если бы они могли, они могли бы изменить всех остальных пароль тоже. Чтобы решить эту проблему,passwd программа имеет бит, установленный в ее разрешениях на файл (известный как setuid bit), который указывает ОС, что он должен быть запущен с EUID владельца программы (например,root), даже если он запущен другим пользователем. The passwd программа увидит его UID как запускающий пользователь и его EUID как root. Запись в файл системного пароля требует, чтобы EUID был привилегированным. UID тоже полезен, так как passwd нужно знать, какой пользователь это изменение пароля для.

есть несколько других случаев, когда UID и EUID не совпадают, но они не слишком распространены. Например, файловый сервер, работающий от имени суперпользователя, может изменить свой EUID в соответствии с конкретным пользователем, который запрашивает некоторые манипуляции с файлами. Использование euid пользователя позволяет серверу избегать доступа к вещам, которые пользователю не разрешено трогать.


функции os.getuid() возвращает ID пользователя, который запускает вашу программу. Функция os.geteuid() пользователя использование программы разрешения. В большинстве случаев это будет то же самое. Хорошо известен случай, когда эти значения будут отличаться, когда setuid бит установлен для исполняемого файла вашей программы, и пользователь, который запускает вашу программу, отличается от пользователя, который имеет исполняемый файл программы. В этом случае os.getuid() вернет ID пользователя, который запускает программу, в то время как os.geteuid() вернет ID пользователя, владеющего программой выполнимый.