6

os.getlogin()在 Linux 上使用和os.environ获取当前用户的用户名有区别吗?

在不同的时候,我看到有人建议查看环境变量$USERor $LOGNAME,而其他时候os.getlogin()则被推荐。

所以我很好奇:是首选一种,还是在某些情况下您会使用一种而不是另一种,或者它们只是做同一件事的两种方式?

4

3 回答 3

15

更新:使用getpass.getuser()

getpass.getuser()方便地搜索各种用户环境变量以获取用户名。这避免了os.getlogin()下面列举的问题。

如果您担心人们修改环境变量,请使用pwd.getpwuid(os.getuid())[0].

文档

此函数按顺序检查环境变量LOGNAME、和USER,并返回第一个设置为非空字符串的值。如果未设置,则在支持 pwd 模块的系统上返回密码数据库中的登录名,否则将引发异常。LNAMEUSERNAME

一般来说,这个函数应该优先于os.getlogin().

来自Python文档os.getlogin()

对于大多数目的,使用它更有用,getpass.getuser()因为后者检查环境变量LOGNAMEUSERNAME找出用户是谁,然后回退到pwd.getpwuid(os.getuid())[0]获取当前真实用户 ID 的登录名。

旧答案:问题os.getlogin()

TL;博士

os.getlogin()在某些情况下运行时可能会引发错误。使用LOGNAME, USER,USERNAME等环境变量(在检查它们是否存在之后)是更安全的选择。如果您真的担心人们会更改环境变量,那么您可以使用 . 从当前进程 ID 中提取用户名pwd.getpwuid(os.getuid())[0]

更长的解释

一个问题os.getlogin()是你不能在没有控制终端的情况下运行它。 从文档

os.getlogin()

返回在进程的控制终端上登录的用户名。对于大多数目的,使用环境变量 LOGNAME 或 USERNAME 来找出用户是谁,或者使用 pwd.getpwuid(os.getuid())[0] 来获取当前真实用户 id 的登录名会更有用。

如果您尝试在os.getlogin()没有控制终端的情况下拨打电话,您将得到

OSError: [Errno 25] Inappropriate ioctl for device

所以使用LOGNAME, USER,USERNAME等环境变量比os.getlogin(). 如果您真的担心人们会更改环境变量,那么您可以使用pwd.getpwuid(os.getuid())[0].

于 2018-01-19T17:19:30.323 回答
5

os.environ['USER']可以撒谎,根本没有安全控制,os.getlogin没有那个问题。

如果您出于任何安全目的使用 ID 检查,请不要依赖环境。

例如,以 user 身份运行lowpriv,检查环境会告诉你当你像这样运行时你是 root bash

USER=root myscript.py
于 2017-11-22T21:35:15.517 回答
0

我猜在基于 UNIX 的系统中,它真的只是归结为个人喜好。os.getlogin()如果我打算为其他平台(例如 Windows)编写代码,我会使用它。而且,环境变量更容易被操纵。因此在安全性优先的情况下使用它会更安全。

于 2017-11-22T21:40:46.067 回答