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

San*_*mar 31 python uid

文档os.getuid()说:

返回当前进程的用户标识.

而且os.geteuid()说:

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

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

对我来说,两者的作用相同(在2.x和3.x上).我用它来检查脚本是否以root身份运行.

Blc*_*ght 59

要了解如何os.getuidos.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允许服务器避免访问不允许用户触摸的内容.

  • TL;DR:“*当您执行某些需要特殊访问权限的操作时,仅检查 EUID [...]。UID 指示执行操作的实际用户,但(通常)在检查权限时不考虑它*” (你把答案放在第三段,有点掩埋了答案) (2认同)

Mik*_*rov 6

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