40

的文档os.getuid()说:

返回当前进程的用户 ID。

os.geteuid()

返回当前进程的有效用户id。

那么用户 id有效用户 id有什么区别呢?

对我来说,两者都一样(在 2.x 和 3.x 上)。我正在使用它来检查脚本是否以 root 身份运行。

4

2 回答 2

67

要了解如何os.getuidos.geteuid不同,您需要了解它们不是 Python 特定的函数(除了os模块前缀)。这些函数封装了基本上所有类 Unix 操作系统提供的getuid和系统调用。geteuid

因此,与其查看 Python 文档(不太可能提供很多细节),不如查看适用于您操作系统的文档。例如,这里是 Linux 的相关文档。维基百科也有一篇关于 Unix 用户 ID 的好文章

常规 UID 和有效 UID 之间的区别在于,当您执行需要特殊访问权限的操作(例如读取或写入文件,或进行某些系统调用)时,只会检查 EUID。UID 指示正在执行操作的实际用户,但在检查权限时(通常)不考虑它。在正常程序中,它们是相同的。一些程序会更改其 EUID 以添加或减去允许执行的操作。少数人也会更改他们的 UID,以有效地“成为”另一个用户。

这是一个更改其 EUID 的程序的示例:该passwd程序(用于更改您的密码)必须写入系统的密码文件,该文件由 root 用户拥有。普通用户无法写入该文件,因为如果可以,他们也可以更改其他所有人的密码。为了解决这个问题,程序在其passwd文件权限(称为 然后程序会将其视为启动用户,并将其 EUID 视为 root。写入系统密码文件需要 EUID 具有特权。UID 也很有用,因为需要知道它正在为哪个用户更改密码。setuid bitrootpasswdUIDpasswd

还有其他一些 UID 和 EUID 不匹配的情况,但它们并不太常见。例如,作为超级用户运行的文件服务器可能会更改其 EUID 以匹配请求某些文件操作的特定用户。使用用户的 EUID 可以让服务器避免访问不允许用户接触的东西。

于 2013-02-19T07:11:11.497 回答
6

函数os.getuid()返回运行您的程序的用户的 ID。您的程序使用权限的用户的功能os.geteuid()。在大多数情况下,这将是相同的。众所周知,当这些值不同时,setuid为您的程序可执行文件设置了位,并且运行您的程序的用户与拥有程序可执行文件的用户不同。在这种情况下os.getuid(),将返回运行程序的用户 ID,而os.geteuid()将返回拥有程序可执行文件的用户 ID。

于 2013-02-19T05:24:29.853 回答