「sudo」で始まるユーザー名を取得する方法

「sudo」で始まるユーザー名を取得する方法

私の問題:ユーザーが使用する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

関連情報