Ответ 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 позволяет серверу избегать доступа к вещам, которые пользователь не может коснуться.