os.getlogin()在 Linux 上使用和os.environ获取当前用户的用户名有区别吗?
在不同的时候,我看到有人建议查看环境变量$USERor $LOGNAME,而其他时候os.getlogin()则被推荐。
所以我很好奇:是首选一种,还是在某些情况下您会使用一种而不是另一种,或者它们只是做同一件事的两种方式?
os.getlogin()在 Linux 上使用和os.environ获取当前用户的用户名有区别吗?
在不同的时候,我看到有人建议查看环境变量$USERor $LOGNAME,而其他时候os.getlogin()则被推荐。
所以我很好奇:是首选一种,还是在某些情况下您会使用一种而不是另一种,或者它们只是做同一件事的两种方式?
getpass.getuser()getpass.getuser()方便地搜索各种用户环境变量以获取用户名。这避免了os.getlogin()下面列举的问题。
如果您担心人们修改环境变量,请使用pwd.getpwuid(os.getuid())[0].
从文档:
此函数按顺序检查环境变量
LOGNAME、和USER,并返回第一个设置为非空字符串的值。如果未设置,则在支持 pwd 模块的系统上返回密码数据库中的登录名,否则将引发异常。LNAMEUSERNAME一般来说,这个函数应该优先于
os.getlogin().
来自Python文档:os.getlogin()
对于大多数目的,使用它更有用,
getpass.getuser()因为后者检查环境变量LOGNAME或USERNAME找出用户是谁,然后回退到pwd.getpwuid(os.getuid())[0]获取当前真实用户 ID 的登录名。
os.getlogin()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].
os.environ['USER']可以撒谎,根本没有安全控制,os.getlogin没有那个问题。
如果您出于任何安全目的使用 ID 检查,请不要依赖环境。
例如,以 user 身份运行lowpriv,检查环境会告诉你当你像这样运行时你是 root bash:
USER=root myscript.py
我猜在基于 UNIX 的系统中,它真的只是归结为个人喜好。os.getlogin()如果我打算为其他平台(例如 Windows)编写代码,我会使用它。而且,环境变量更容易被操纵。因此在安全性优先的情况下使用它会更安全。