在 Python 中有没有一种可移植的方法来获取当前用户名?
- 2024-12-11 08:48:00
- admin 原创
- 201
问题描述:
有什么可移植的方法(例如适用于 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.name
和if
语句的用途。
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_USER
并USER
在这种情况下给出错误的结果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"))
扫码咨询,免费领取项目管理大礼包!