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

2024-05-13 06:37:39 发布

您现在位置:Python中文网/ 问答频道 /正文

os.getuid()的文档说明:

Return the current process’s user id.

os.geteuid()中说:

Return the current process’s effective user id.

那么用户id有效用户id之间的区别是什么?

对我来说,两者的工作原理都是一样的(在2.x和3.x上)。我使用它来检查脚本是否作为根运行。


Tags: the用户文档脚本idreturnoscurrent
2条回答

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

要理解os.getuidos.geteuid的区别,您需要理解它们不是特定于Python的函数(除了os模块前缀)。这些函数包装了本质上所有类Unix操作系统提供的getuidgeteuid系统调用。

因此,与其查看Python文档(不太可能给出很多细节),不如查看操作系统的文档。Here是例如Linux的相关文档。维基百科也有一个很好的article on Unix User IDs

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

下面是一个更改其EUID的程序示例:passwd程序(用于更改密码)必须写入系统的密码文件,该文件归根用户所有。普通用户无法写入该文件,因为如果可以,他们也可以更改其他人的密码。为了解决这个问题,passwd程序在其文件权限(称为setuid bit)中设置了一个位,该位向操作系统指示,它应该使用程序所有者的EUID(例如root)运行,即使它是由另一个用户启动的。然后passwd程序会将其UID视为启动用户,将其EUID视为根用户。写入系统密码文件要求EUID具有特权。UID也很有用,因为passwd需要知道它正在为哪个用户更改密码。

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

相关问题 更多 >