我的问题:我有一个 Python 程序,用户使用sudo
.有时我必须获取用户的家,而我只需知道其名称即可做到这一点:
import pwd
pwd.getpwnam(username)
那么:如何获取启动该程序的用户的名称?
答案1
当您启动一些sudo
设置了几个环境变量的东西时,特别是我认为您正在寻找SUDO_UID
.通过访问环境变量的常用渠道运行的任何程序都应该可以访问这些内容。
您可以通过从 shell 中像这样进行作弊来查看其他设置:sudo env | grep SUDO
答案2
这是我目前用于涵盖 systemd (="root")、sudo、pkexec 和正常执行的方法。肯定可以变得更漂亮:
import os
import getpass
import pwd
def get_user():
"""Try to find the user who called sudo/pkexec."""
try:
return os.getlogin()
except OSError:
# failed in some ubuntu installations and in systemd services
pass
try:
user = os.environ['USER']
except KeyError:
# possibly a systemd service. no sudo was used
return getpass.getuser()
if user == 'root':
try:
return os.environ['SUDO_USER']
except KeyError:
# no sudo was used
pass
try:
pkexec_uid = int(os.environ['PKEXEC_UID'])
return pwd.getpwuid(pkexec_uid).pw_name
except KeyError:
# no pkexec was used
pass
return user
➜ ~ python3 /home/mango/getuser.py
mango
➜ ~ sudo python3 /home/mango/getuser.py
mango
➜ ~ pkexec python3 /home/mango/getuser.py
mango