文档os.getuid()
说:
返回当前进程的用户标识.
而且os.geteuid()
说:
返回当前进程的有效用户ID.
那么用户ID和有效用户ID之间有什么区别?
对我来说,两者的作用相同(在2.x和3.x上).我用它来检查脚本是否以root身份运行.
Blc*_*ght 59
要了解如何os.getuid
和os.geteuid
不同,您需要了解它们不是特定于Python的函数(os
模块前缀除外).这些功能是包裹getuid
,并geteuid
通过基本上所有的类Unix操作系统提供的系统调用.
因此,您应该查看适用于您的操作系统的文档,而不是查看Python文档(不太可能提供大量详细信息).以下是Linux的相关文档.维基百科也有一篇关于Unix用户ID的好文章.
常规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允许服务器避免访问不允许用户触摸的内容.
函数os.getuid()
返回运行程序的用户的ID.os.geteuid()
您的程序使用权限的用户的功能.在大多数情况下,这将是相同的.众所周知,当这些值不同时,setuid
为程序可执行文件设置位,运行程序的用户与拥有程序可执行文件的用户不同.在这种情况下os.getuid()
将返回运行程序os.geteuid()
的用户的ID ,同时将返回拥有程序可执行文件的用户的ID.