什么是获取当前用户的用户名的可移植方法(例如Linux和Windows) ?类似于os.getuid()的东西会很好:
>>> os.getuid()
42
# Does not currently exist in Python
>>> os.getusername()
'slartibartfast'
pwd模块仅适用于Unix。有些人认为,在某些情况下,在Windows下获取用户名可能会很复杂(例如,作为Windows服务运行)。
什么是获取当前用户的用户名的可移植方法(例如Linux和Windows) ?类似于os.getuid()的东西会很好:
>>> os.getuid()
42
# Does not currently exist in Python
>>> os.getusername()
'slartibartfast'
pwd模块仅适用于Unix。有些人认为,在某些情况下,在Windows下获取用户名可能会很复杂(例如,作为Windows服务运行)。
当前回答
以上方法在我的案例中都不起作用(向下滚动到实际的解决方案)。 我得到的所有解决方案的问题是错误的用户名时运行命令与sudo:
psutil soulution:
$ python3
>>> import psutil
>>> psutil.Process().username()
'ubuntu' # OK!
$ sudo su
$ python3
>>> import psutil
>>> psutil.Process().username()
'root' # OK!
$ sudo python3
>>> import psutil
>>> psutil.Process().username()
'root' # WRONG, should be ubuntu!
getpass解决方案:
$ python3
>>> import getpass
>>> getpass.getuser()
'ubuntu' # OK!
$ sudo su
$ python3
>>> import getpass
>>> getpass.getuser()
'root' # OK!
$ sudo python3
>>> import getpass
>>> getpass.getuser()
'root' # WRONG, should be ubuntu!
PWD + os。getuid解决方案:
$ python3
>>> import os, pwd
>>> pwd.getpwuid( os.getuid() )[ 0 ]
'ubuntu' # OK!
$ sudo su
$ python3
>>> import os, pwd
>>> pwd.getpwuid( os.getuid() )[ 0 ]
'root' # OK!
$ sudo python3
>>> import getpass
>>> getpass.getuser()
'root' # WRONG, should be ubuntu!
操作系统。Getlogin的工作方式有点不同,但仍然是错误的:
$ python3
>>> import os
>>> os.getlogin()
'ubuntu' # OK!
$ sudo su
$ python3
>>> import os
>>> os.getlogin()
'ubuntu' # WRONG, should be root!
$ sudo python3
>>> import os
>>> os.getlogin()
'ubuntu' # OK!
操作系统。Getenv给出了相同的结果:
$ python3
>>> import os
>>> os.getenv('SUDO_USER', os.getenv('USER'))
'ubuntu' # OK!
$ sudo su
$ python3
>>> import os
>>> os.getenv('SUDO_USER', os.getenv('USER'))
'ubuntu' # WRONG, should be root!
$ sudo python3
>>> import os
>>> os.getenv('SUDO_USER', os.getenv('USER'))
'ubuntu' # OK!
在sudo python3情况下,切换SUDO_USER和USER会给出错误的结果。
实际解决方案(不可移植)
解决方案有点棘手,依赖于默认的根主目录位置,但适用于所有情况:
$ python3
>>> import os
>>> 'root' if os.path.expanduser('~') == '/root' else os.getenv('SUDO_USER', os.getenv('USER'))
'ubuntu' # OK!
$ sudo su
$ python3
>>> import os
>>> 'root' if os.path.expanduser('~') == '/root' else os.getenv('SUDO_USER', os.getenv('USER'))
'root' # OK!
$ sudo python3
>>> import os
>>> 'root' if os.path.expanduser('~') == '/root' else os.getenv('SUDO_USER', os.getenv('USER'))
'ubuntu' # OK!
其他回答
你还可以使用:
os.getlogin()
窗口:
os.environ.get('USERNAME')
Linux:
os.environ.get('USER')
两个:
os.environ.get('USER', os.environ.get('USERNAME'))
请注意,用户可以修改环境变量,因此这是一个潜在的安全漏洞。使用这种方法,攻击者可以很容易地伪造他们的用户名。
以上方法在我的案例中都不起作用(向下滚动到实际的解决方案)。 我得到的所有解决方案的问题是错误的用户名时运行命令与sudo:
psutil soulution:
$ python3
>>> import psutil
>>> psutil.Process().username()
'ubuntu' # OK!
$ sudo su
$ python3
>>> import psutil
>>> psutil.Process().username()
'root' # OK!
$ sudo python3
>>> import psutil
>>> psutil.Process().username()
'root' # WRONG, should be ubuntu!
getpass解决方案:
$ python3
>>> import getpass
>>> getpass.getuser()
'ubuntu' # OK!
$ sudo su
$ python3
>>> import getpass
>>> getpass.getuser()
'root' # OK!
$ sudo python3
>>> import getpass
>>> getpass.getuser()
'root' # WRONG, should be ubuntu!
PWD + os。getuid解决方案:
$ python3
>>> import os, pwd
>>> pwd.getpwuid( os.getuid() )[ 0 ]
'ubuntu' # OK!
$ sudo su
$ python3
>>> import os, pwd
>>> pwd.getpwuid( os.getuid() )[ 0 ]
'root' # OK!
$ sudo python3
>>> import getpass
>>> getpass.getuser()
'root' # WRONG, should be ubuntu!
操作系统。Getlogin的工作方式有点不同,但仍然是错误的:
$ python3
>>> import os
>>> os.getlogin()
'ubuntu' # OK!
$ sudo su
$ python3
>>> import os
>>> os.getlogin()
'ubuntu' # WRONG, should be root!
$ sudo python3
>>> import os
>>> os.getlogin()
'ubuntu' # OK!
操作系统。Getenv给出了相同的结果:
$ python3
>>> import os
>>> os.getenv('SUDO_USER', os.getenv('USER'))
'ubuntu' # OK!
$ sudo su
$ python3
>>> import os
>>> os.getenv('SUDO_USER', os.getenv('USER'))
'ubuntu' # WRONG, should be root!
$ sudo python3
>>> import os
>>> os.getenv('SUDO_USER', os.getenv('USER'))
'ubuntu' # OK!
在sudo python3情况下,切换SUDO_USER和USER会给出错误的结果。
实际解决方案(不可移植)
解决方案有点棘手,依赖于默认的根主目录位置,但适用于所有情况:
$ python3
>>> import os
>>> 'root' if os.path.expanduser('~') == '/root' else os.getenv('SUDO_USER', os.getenv('USER'))
'ubuntu' # OK!
$ sudo su
$ python3
>>> import os
>>> 'root' if os.path.expanduser('~') == '/root' else os.getenv('SUDO_USER', os.getenv('USER'))
'root' # OK!
$ sudo python3
>>> import os
>>> 'root' if os.path.expanduser('~') == '/root' else os.getenv('SUDO_USER', os.getenv('USER'))
'ubuntu' # OK!
这些可能有用。我不知道它们作为服务运行时表现如何。它们是不可移植的,但这就是os.name和ifstatement的用途。
win32api.GetUserName()
win32api.GetUserNameEx(...)
看到的: http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html
您可以通过Windows API在Windows上获得当前用户名,尽管通过ctypes FFI (GetCurrentProcess→OpenProcessToken→GetTokenInformation→LookupAccountSid)调用它有点麻烦。
我写了一个小模块,可以直接用Python来做这个,getuser.py。用法:
import getuser
print(getuser.lookup_username())
它可以在Windows和*nix上工作(后者使用pwd模块,如其他答案所述)。