os.getuid()和os.geteuid()有什么区别?

42

os.getuid()的文档说:

返回当前进程的用户ID。

os.geteuid()的文档说:

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

那么用户ID有效用户ID之间有什么区别呢?

对我来说,两者都是相同的(适用于2.x和3.x)。我正在使用它来检查脚本是否以root权限运行。


在 setuid 程序中它们并不相同 (对于任何以 root 身份运行并显式调用 seteuid 的程序都可能是不同的)。这意味着当你的脚本启动时它们相同的。 - Anton Kovalenko
2个回答

70
要理解 os.getuidos.geteuid 的区别,需要明白它们都不是 Python 特有的函数(除了 os 模块前缀)。这些函数包装了由几乎所有类 Unix 操作系统提供的 getuidgeteuid 系统调用。
因此,与其查看 Python 文档(里面可能不会提供太多细节),您应该查看操作系统的文档。例如,这里 是 Linux 相关的文档。维基百科也有一篇很好的Unix 用户标识符文章
常规 UID 和有效 UID 之间的区别在于,只有 EUID 在执行需要特殊访问权限的操作(如读写文件或进行某些系统调用)时才会被检查。 UID 指示执行操作的实际用户,但通常不考虑权限。在普通程序中,它们将是相同的。一些程序更改它们的 EUID 以添加或删除它们允许执行的操作。较少数的程序更改其 UID,以有效地“成为”另一个用户。这是一个改变EUID的程序示例:passwd程序(用于更改密码)必须写入系统密码文件,该文件由root用户拥有。普通用户无法对该文件进行写操作,因为如果他们可以这样做,他们就可以更改其他所有用户的密码。为了解决这个问题,passwd程序在其文件权限中设置了一个位(称为setuid bit),告诉操作系统它应该使用程序所有者(例如root)的EUID运行,即使它是由另一个用户启动的。然后,passwd程序将其UID视为启动用户,将其EUID视为root。需要特权的EUID才能写入系统密码文件。UID也很有用,因为passwd需要知道要更改哪个用户的密码。
还有一些其他情况下UID和EUID不匹配,但它们并不太常见。例如,以超级用户身份运行的文件服务器可能会更改其EUID以匹配请求某些文件操作的特定用户。使用用户的EUID允许服务器避免访问用户不允许触及的内容。

3
只有当进行需要特殊访问权限的操作时才会检查EUID(effective user ID),而UID(user ID)表示实际执行该操作的用户,但通常在检查权限时不考虑它。这个答案被放在第三段中稍微有些隐蔽。 - Luc

7

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


你能详细说明 os.geteuid() 部分吗?并且你能给出例子来展示两者不同吗,即 x 只能通过 getuid 实现而不能通过 geteuid 实现,而 y 只能通过 geteuid 实现而不能通过getuid 实现? - Santosh Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接