擅长:python、mysql、java
<p>要理解<code>os.getuid</code>和<code>os.geteuid</code>的区别,您需要理解它们不是特定于Python的函数(除了<code>os</code>模块前缀)。这些函数包装了本质上所有类Unix操作系统提供的<code>getuid</code>和<code>geteuid</code>系统调用。</p>
<p>因此,与其查看Python文档(不太可能给出很多细节),不如查看操作系统的文档。<a href="https://www.kernel.org/doc/man-pages/online/pages/man2/geteuid.2.html" rel="noreferrer">Here</a>是例如Linux的相关文档。维基百科也有一个很好的<a href="https://en.wikipedia.org/wiki/User_identifier" rel="noreferrer">article on Unix User IDs</a>。</p>
<p>常规UID和有效UID的区别在于,当您执行需要特殊访问(例如读取或写入文件或进行某些系统调用)的操作时,只检查EUID。UID指示执行操作的实际用户,但在检查权限时(通常)不考虑它。在正常程序中,它们将是相同的。有些程序将其EUID更改为允许它们执行的操作的加或减。较小的数字也会更改他们的UID,从而有效地“成为”另一个用户。</p>
<p>下面是一个更改其EUID的程序示例:<code>passwd</code>程序(用于更改密码)必须写入系统的密码文件,该文件归根用户所有。普通用户无法写入该文件,因为如果可以,他们也可以更改其他人的密码。为了解决这个问题,<code>passwd</code>程序在其文件权限(称为<code>setuid bit</code>)中设置了一个位,该位向操作系统指示,它应该使用程序所有者的EUID(例如<code>root</code>)运行,即使它是由另一个用户启动的。然后<code>passwd</code>程序会将其<code>UID</code>视为启动用户,将其EUID视为根用户。写入系统密码文件要求EUID具有特权。UID也很有用,因为<code>passwd</code>需要知道它正在为哪个用户更改密码。</p>
<p>还有一些情况下UID和EUID不匹配,但它们并不太常见。例如,作为超级用户运行的文件服务器可能会更改其EUID以匹配请求某些文件操作的特定用户。使用用户的EUID允许服务器避免访问用户不允许接触的内容。</p>