使用os.getlogin()
和os.environ
获取Linux上当前用户的用户名是否有区别?
在不同的时间,我看到有人建议查看环境变量$USER
或$LOGNAME
,有时建议os.getlogin()
。
所以我很好奇:是首选,还是有些情况下你会使用其中一种,或者只是两种方式做同样的事情?
答案 0 :(得分:5)
getpass.getuser()
getpass.getuser()
可以方便地搜索各种用户环境变量以获取用户名。这可以避免下面列举的os.getlogin()
问题。
如果您担心人们修改环境变量,请使用pwd.getpwuid(os.getuid())[0]
。
来自docs:
此函数按顺序检查环境变量
LOGNAME
,USER
,LNAME
和USERNAME
,并返回第一个设置为非变量的值-empty字符串。如果未设置,则在支持pwd模块的系统上返回密码数据库的登录名,否则将引发异常。通常,此功能应优先于
os.getlogin()
。
来自os.getlogin()
的{{3}}:
对于大多数用途,使用
getpass.getuser()
更有用,因为后者检查环境变量LOGNAME
或USERNAME
以找出用户是谁,然后回退到{{} 1}}获取当前真实用户ID的登录名。
pwd.getpwuid(os.getuid())[0]
os.getlogin()
会抛出错误。使用os.getlogin()
,LOGNAME
,USER
等环境变量(在检查它们存在之后)是更安全的选项。如果您真的担心人们更改环境变量,那么您可以使用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
,LOGNAME
,USER
等环境变量比USERNAME
更安全。如果您真的担心人们更改环境变量,那么您可以使用os.getlogin()
。
答案 1 :(得分:3)
os.environ['USER']
可以撒谎,完全没有安全控制,os.getlogin
没有这个问题。
如果您出于任何安全目的使用ID检查,请不要依赖环境。
示例,以用户lowpriv
身份运行,检查环境会告诉您在bash
中运行时是root用户:
USER=root myscript.py
答案 2 :(得分:0)
我想在基于UNIX的系统中,它实际上归结为个人偏好。如果我打算为其他平台(如windows)编写代码,我会使用os.getlogin()
。而且,环境变量更容易被操纵。因此,在安全性优先的情况下使用它会更安全。