私の問題:ユーザーが使用するPythonプログラムがありますsudo
。時々あなたの家を持って来る必要があり、そうするためには名前だけを知る必要があります。
import pwd
pwd.getpwnam(username)
だから:プログラムを起動したユーザーの名前をどのように知ることができますか?
答え1
sudo
いくつかの環境変数を設定する何かを開始するときは、特にSUDO_UID
環境変数にアクセスする一般的なチャネルを介して実行されるすべてのプログラムがそれにアクセスできる必要があります。
シェルでは、次のようにトリックを使用して他の設定を表示できます。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