os.getuid() 和 os.geteuid() 有什么区别?
关于 os.getuid()
的说明是:
返回当前进程的用户 ID。
而 os.geteuid()
的说明是:
返回当前进程的有效用户 ID。
那么用户 ID和有效用户 ID有什么区别呢?
对我来说,这两个在 2.x 和 3.x 版本上的表现是一样的。我用它来检查脚本是否以 root 用户身份运行。
2 个回答
函数 os.getuid()
会返回运行你程序的用户的身份ID。函数 os.geteuid()
则返回你的程序使用权限的用户的身份ID。在大多数情况下,这两个值是一样的。不过,有一种情况这两个值会不同,那就是当你的程序的可执行文件设置了 setuid
位,而运行你程序的用户和拥有这个可执行文件的用户不一样。在这种情况下,os.getuid()
会返回运行程序的用户的ID,而 os.geteuid()
会返回拥有程序可执行文件的用户的ID。
要理解 os.getuid
和 os.geteuid
之间的区别,首先要知道这两个函数并不是Python特有的(除了前面的 os
模块)。它们实际上是对 getuid
和 geteuid
系统调用的封装,这些调用在几乎所有类Unix的操作系统中都有。
所以,与其查看Python的文档(通常不会提供很多细节),不如去查查你操作系统的文档。例如,这里Unix用户ID的不错文章。
普通的用户ID(UID)和有效用户ID(EUID)之间的区别在于,只有EUID在执行需要特殊权限的操作时会被检查(比如读取或写入文件,或者进行某些系统调用)。UID表示实际执行操作的用户,但在检查权限时通常不考虑它。在正常情况下,这两个ID是相同的。有些程序会改变它们的EUID,以增加或减少它们被允许执行的操作。更少数的程序还会改变它们的UID,从而“变成”另一个用户。
举个例子,passwd
程序(用于更改密码)必须写入系统的密码文件,而这个文件是由root用户拥有的。普通用户无法写入这个文件,因为如果可以的话,他们就能更改其他所有用户的密码。为了解决这个问题,passwd
程序在其文件权限中设置了一个标志(称为 setuid bit
),这告诉操作系统即使是由其他用户启动,也应该以程序拥有者的EUID(例如 root
)来运行。这样,passwd
程序看到的UID是启动它的用户,而EUID则是root。写入系统密码文件需要特权的EUID。UID也很重要,因为passwd
需要知道它正在为哪个用户更改密码。
还有一些其他情况,UID和EUID不会匹配,但这些情况并不常见。例如,一个以超级用户身份运行的文件服务器可能会将其EUID更改为请求某些文件操作的特定用户。使用用户的EUID可以让服务器避免访问用户不允许接触的内容。