获取用户名的os.getlogin()和os.environ之间的区别

时间:2017-11-22 21:32:56

标签: python linux python-3.x python-os

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

在不同的时间,我看到有人建议查看环境变量$USER$LOGNAME,有时建议os.getlogin()

所以我很好奇:是首选,还是有些情况下你会使用其中一种,或者只是两种方式做同样的事情?

3 个答案:

答案 0 :(得分:5)

更新:使用getpass.getuser()

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

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

来自docs

  

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

     

通常,此功能应优先于os.getlogin()

来自os.getlogin()的{​​{3}}:

  

对于大多数用途,使用getpass.getuser()更有用,因为后者检查环境变量LOGNAMEUSERNAME以找出用户是谁,然后回退到{{} 1}}获取当前真实用户ID的登录名。

旧答案:pwd.getpwuid(os.getuid())[0]

的问题

TL; DR

在某些情况下运行时,

os.getlogin()会抛出错误。使用os.getlogin()LOGNAMEUSER等环境变量(在检查它们存在之后)是更安全的选项。如果您真的担心人们更改环境变量,那么您可以使用USERNAME从当前进程ID中提取用户名。

更长的解释

pwd.getpwuid(os.getuid())[0]的一个问题是你不能在没有控制终端的情况下运行它。 Python docs

  

os.getlogin()

     

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

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

os.getlogin()

因此,使用OSError: [Errno 25] Inappropriate ioctl for device LOGNAMEUSER等环境变量比USERNAME更安全。如果您真的担心人们更改环境变量,那么您可以使用os.getlogin()

答案 1 :(得分:3)

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

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

示例,以用户lowpriv身份运行,检查环境会告诉您在bash中运行时是root用户:

USER=root myscript.py

答案 2 :(得分:0)

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