通知发送在使用 sudo 运行的 python 脚本中不起作用

der*_*mai 2 python bash notifications sudo notify-send

我正在编写一个使用 sudo 权限运行的 python 脚本。在某个时候,我想向用户发送通知。我注意到notify-send不能作为root用户工作,所以我尝试通过执行以实际用户身份运行它su $SUDO_USER -c notify-send ...,但这也不起作用。

以下第一个函数在没有 sudo 权限的情况下运行时有效。当使用 sudo 运行时,它们都不起作用。知道为什么吗?

def notify(message):

    subprocess.run(['notify-send', '-i', 'utilities-terminal', 'Notification Title', message],
                   stdout=subprocess.PIPE,
                   stderr=subprocess.PIPE,
                   check=True)


def notifySudo(message):

    subprocess.run(['su', os.environ['SUDO_USER'], '-c', 'notify-send', '-i', 'utilities-terminal', 'Notification Title', message],
                   stdout=subprocess.PIPE,
                   stderr=subprocess.PIPE,
                   check=True)
Run Code Online (Sandbox Code Playgroud)

der*_*mai 7

经过一番研究后,我找到了解决方案:

import os

def notify(title, message):

    userID = subprocess.run(['id', '-u', os.environ['SUDO_USER']],
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE,
                            check=True).stdout.decode("utf-8").replace('\n', '')


    subprocess.run(['sudo', '-u', os.environ['SUDO_USER'], 'DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/{}/bus'.format(userID), 
                    'notify-send', '-i', 'utilities-terminal', title, message],
                    stdout=subprocess.PIPE,
                    stderr=subprocess.PIPE,
                    check=True)
Run Code Online (Sandbox Code Playgroud)