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

2024-12-11 08:48:00
admin
原创
201
摘要:问题描述:有什么可移植的方法(例如适用于 Linux 和 Windows)来获取当前用户的用户名?类似的东西os.getuid()会很好:>>> os.getuid() 42 # Does not currently exist in Python >>> os.getu...

问题描述:

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

>>> os.getuid()
42

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

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


解决方案 1:

查看getpass模块

import getpass
getpass.getuser()
'kostya'

可用性:Unix,Windows


ps 根据下面的评论“此函数查看各种环境变量的值以确定用户名。因此,不应依赖此功能进行访问控制目的(或任何其他目的,因为它允许任何用户冒充任何其他用户)。

解决方案 2:

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

import os
import pwd

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

查看pwd文档了解更多详细信息。

解决方案 3:

您还可以使用:

os.getlogin()

解决方案 4:

视窗:

os.environ.get('USERNAME')

Linux:

os.environ.get('USER')

两个都:

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

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

解决方案 5:

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

win32api.GetUserName()

win32api.GetUserNameEx(...) 

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

解决方案 6:

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

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

您还可以解析此类字符串以仅获取最后的路径部分(即用户名)。

看:os.path.expanduser

解决方案 7:

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

import psutil

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

在本质上,这结合了getpwuid基于 unix 的方法和GetTokenInformation基于 Windows 的方法。

解决方案 8:

对我来说,使用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]           

输出:

视窗:

用户主目录:C:\Users\myuser

用户名:myuser

Linux:

用户主目录:/root

用户名:root

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

解决方案 9:

根据其他答案,结合pwd和方法:getpass

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()

解决方案 10:

仅使用标准 Python 库:

from os import environ
from sys import platform

def getUser():
    return environ["USERNAME"] if platform.startswith("win") else environ["USER"]

user = getUser()

适用于 Windows、Mac 或 Linux。

解决方案 11:

至少对于 UNIX 来说,这是可行的......

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

编辑:
我刚刚查了一下,它适用于 Windows 和 UNIX:

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

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

--

IE

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 中的某些应用程序中可能会有帮助。

解决方案 12:

以上方法都不适用于我的情况(向下滚动到实际解决方案)。

我遇到的所有解决方案的问题是使用以下命令运行命令时用户名错误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_USERUSER在这种情况下给出错误的结果sudo 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!

解决方案 13:

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

用法:

import plx

username = plx.get_username()

(它需要 Windows 上的 win32 扩展)

解决方案 14:

您可以通过 Windows API 获取 Windows 上的当前用户名,尽管通过 ctypes FFI( GetCurrentProcess → OpenProcessToken → GetTokenInformation → LookupAccountSid )调用有点麻烦。

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

import getuser
print(getuser.lookup_username())

它适用于 Windows 和 *nix(后者使用pwd其他答案中描述的模块)。

解决方案 15:

这对我有用:

import os
os.cmd("whoami")
print (os.cmd("whoami"))
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2560  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1552  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   1  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   2  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   3  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用