Уведомление-отправка не работает в скрипте python, запущенном с помощью sudo

Я пишу скрипт Python, который запускается с разрешениями sudo. В какой-то момент я хотел бы отправить уведомление пользователю. Я заметил, что 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)

person dvilela    schedule 11.02.2019    source источник
comment
Вы должны получить переменную окружения пользователя DISPLAY an XAUTHORITY, чтобы напечатать что-то на его экране.   -  person ctac_    schedule 12.02.2019
comment
@ctac_ Я пробовал export DISPLAY=:0.0 (как видно из других сообщений), а также я видел в некоторых других вопросах этот eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gdm-x-session)/environ)", но он еще не работает. Не могли бы вы дать больше информации?   -  person dvilela    schedule 14.02.2019


Ответы (1)


Итак, после небольшого исследования, я нашел решение:

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)
person dvilela    schedule 15.02.2019