有没有一种可移植的方法来获取Python中的当前用户名?

什么是获取当前用户用户名的可移植方式(例如Linux和Windows)?类似于os.getuid()的东西会很好:

>>> os.getuid()
42


# Does not currently exist in Python
>>> os.getusername()
'slartibartfast'

pwd模块仅适用于Unix。有些人建议在某些情况下(例如,作为Windows服务运行)在Windows下获取用户名可能很复杂。

525188 次浏览

查看getpass模块

import getpass
getpass.getuser()
'kostya'

可用性:Unix、Windows


p. s.每条评论下面“此函数查看各种环境变量的值以确定用户名。因此,不应将此函数用于权限改造目的(或任何其他目的,因为它允许任何用户模拟任何其他用户)。

windows:

os.environ.get('USERNAME')

Linux:

os.environ.get('USER')

两者:

os.environ.get('USER', os.environ.get('USERNAME'))

注意用户可以修改环境变量,所以这是一个潜在的安全漏洞。使用此方法,攻击者可以轻松伪造其用户名。

您还可以使用:

os.getlogin()

这些可能有效。我不知道它们在作为服务运行时的行为如何。它们不可移植,但这就是os.nameif语句的用途。

win32api.GetUserName()


win32api.GetUserNameEx(...)

请看: http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html

我前段时间编写了plx模块,以便在Unix和Windows上以可移植的方式获取用户名(除其他外): http://www.decalage.info/en/python/plx

用法:

import plx


username = plx.get_username()

(在Windows上需要win32扩展)

os.getuid()pwd.getpwuid()组合:

import os
import pwd


def get_username():
return pwd.getpwuid(os.getuid())[0]

有关更多详细信息,请参阅pwd文档。

如果你需要这个来获取用户的主目录,下面可以被认为是可移植的(至少win32和linux),标准库的一部分。

>>> os.path.expanduser('~')
'C:\\Documents and Settings\\johnsmith'

您还可以解析此类字符串以仅获取最后一个路径组件(即用户名)。

见:os.path.expanduser

结合pwdgetpass方法,基于其他答案:

try:
import pwd
except ImportError:
import getpass
pwd = None


def current_user():
if pwd:
return pwd.getpwuid(os.geteuid()).pw_name
else:
return getpass.getuser()

您可以通过Windows API获取Windows上的当前用户名,尽管通过ctype FFI(获取当前进程信息OpenProcessToken获取代币信息查询账号名字)调用有点麻烦。

我写了一个小模块,可以直接从Pythongetuser.py中执行此操作。用法:

import getuser
print(getuser.lookup_username())

它适用于Windows和*nix(后者使用pwd模块,如其他答案所述)。

对我来说,使用os模块看起来最适合可移植性:在Linux和Windows上效果最好。

import os


# Gives user's home directory
userhome = os.path.expanduser('~')


print "User's home Dir: " + userhome


# Gives username by splitting path based on OS
print "username: " + os.path.split(userhome)[-1]

输出:

windows:

用户主页Dir: C:\用户\myuser

用户名:myuser

Linux:

用户主页Dir: /root

用户名:root

无需安装任何模块或扩展。

至少对于UNIX来说,这是有效的…

import commands
username = commands.getoutput("echo $(whoami)")
print username

编辑: 我只是查了一下,这适用于Windows和UNIX:

import commands
username = commands.getoutput("whoami")

在UNIX上,它返回您的用户名,但在Windows上,它返回您的用户组、斜杠、您的用户名。

--

即E.

UNIX返回:“用户名”

Windows返回:“域/用户名”

--

这很有趣,但可能不理想,除非你无论如何都在终端中做某事……在这种情况下,你可能首先使用os.system。例如,不久前我需要将我的用户添加到一个组中,所以我做了(这是在Linux,请注意)

import os
os.system("sudo usermod -aG \"group_name\" $(whoami)")
print "You have been added to \"group_name\"! Please log out for this to take effect"

我觉得这更容易阅读,你不必导入pwd或getPass。

我也觉得“域/用户”在Windows中的某些应用程序中可能会有所帮助。

仅使用标准python库:

from os import environ,getcwd
getUser = lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"]
user = getUser()

适用于Windows(如果您在驱动器C上),Mac或Linux

或者,您可以通过立即调用删除一行:

from os import environ,getcwd
user = (lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"])()

psutil提供了一种可移植的方式,它不像getpass解决方案那样使用环境变量。它不太容易出现安全问题,并且应该是今天公认的答案。

import psutil


def get_username():
return psutil.Process().username()

在引擎盖下,这结合了Unix的基于getpwuid的方法和Windows的GetTokenInformation方法。

以上方法在我的情况下都不起作用(向下滚动到实际解决方案)。
我在所有解决方案中遇到的问题是在使用sudo运行命令时错误的用户名:

  • psutil解决方案:
$ 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!
  • os.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!
  • os.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_USERUSERsudo python3情况下给出错误的结果。

实际解决方案(非便携式)

解决方案有点棘手,依赖于默认的根目录位置,但适用于所有情况:

$ 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!

这对我有用:

import os
os.cmd("whoami")
print (os.cmd("whoami"))