Подтвердить что ты не робот

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

В документации для os.getuid() указано:

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

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

Возвращает действующий идентификатор текущего процесса.

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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