Запуск notify-отправить как root

Я пытаюсь получить уведомление при подключении USB-устройства, для этого я использую правило udev для отслеживания момента его подключения и оттуда запускаю скрипт. Идея скрипта заключалась в том, чтобы использовать то, что объясняется в ссылке.

но при попытке это:

pids=`pgrep -u $user gnome-panel`

я обнаружил, что gnome-panel там нет. Гуглил эту работу, и я нашел довольно мало людей, жалующихся, что эта работа больше не работает. Поэтому я сделал немного исследования на эту тему и придумали это (notify-plugin2.sh):

#!/bin/bash

DBUS_SESSION_BUS_ADDRESS=$(cat /home/user/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-0 | grep DBUS_SESSION_BUS_ADDRESS= | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//')

su user Test.sh $DBUS_SESSION_BUS_ADDRESS

для получения DBUS_SESSION_BUS_ADDRESS перед переключением пользователя на пользователя без root. Это утверждение, если я не ошибаюсь, работает, поэтому на основе кода из приведенной выше ссылки я сделал этот другой скрипт (Test.sh)

#!/bin/sh
user=`whoami`
title="Test"
timeout=30000
icon="~/Pictures/PicturesForPwrPoint/Pluged.jpg"

DBUS_SESSION_BUS_ADDRESS=

echo $DBUS_SESSION_BUS_ADDRESS
DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS  notify-send -u low -t $timeout -i "$icon" "$title"

для того, что я вижу на другом коде, единственной проблемой было получение DBUS_SESSION_BUS_ADDRESS и если я не ошибаюсь, с этим я могу иметь его.

Итак, мой вопрос в том, почему нет фантазии всплывающее сообщение на моем экране при запуске?

sudo sh notify-plugin2.sh

6 ответов


служба уведомлений была изменена на ubuntu 14.04.

его называют теперь smth like org.freedesktop.Notifications.service

вы можете проверить здесь подробнее о Notification On Screen Display возможностей.

также вы можете использовать следующую командную строку для отправки собственных сообщений

пользователь@machine ~$ notify-отправить "текст сообщения"

просто обновите свой скрипт, который запускается udev использовать он.


чтобы обойти проблему, связанную с запуском


чтобы отправить уведомление рабочего стола из фонового сценария, работающего как root
(замените X_user и X_userid на user и userid, выполняющие X соответственно):

sudo -u X_user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/X_userid/bus notify-send 'Hello world!' 'This is an example notification.'

Это было взято из: https://wiki.archlinux.org/index.php/Desktop_notifications


объединение ответ Томи С ответ Хонго на другой вопрос элегантно решает проблему для меня.

function notify-send() {
    #Detect the name of the display in use
    local display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"

    #Detect the user using such display
    local user=$(who | grep '('$display')' | awk '{print }')

    #Detect the id of the user
    local uid=$(id -u $user)

    sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus notify-send "$@"
}

эта функция может использоваться как-есть в любом скрипте, работающем как root, в качестве замены для .


Я также изучал это, чтобы исправить ошибку с поврежденным фоном при перезапуске. Я хотел добавить скрипт в /etc/pm / sleep.d / для его сброса, но необходимо DBUS_SESSION_BUS_ADDRESS, чтобы установить его (рабочий стол gnome). Я обнаружил, что DBUS_SESSION_BUS_ADDRESS хранится в /home / user/.файлы dbus/ session-bus / * не соответствуют файлам в среде пользователей. Но я обнаружил, что он доступен в одной из команд dbus-daemon.

таким образом, я смог получить DBUS_SESSION_BUS_ADDRESS через вырезано ниже, и я успешно смог его использовать. Замените "[username] " своим пользователем. Надеюсь, это поможет.

$ export DBUS_SESSION_BUS_ADDRESS=$(pgrep -a dbus-daemon -U [username] | grep -o 'unix:abstract.*$')

я боролся с уведомить-отправить себя lateley и получил его работу (под Ubuntu 16.04).

Я думаю, что есть 2 аспекта. Вызывающий пользователь должен иметь доступ к дисплею, на котором должно отображаться сообщение и должен быть указан дисплей.

root@mymachine~# who
root     tty1         2017-06-19 16:30
<user1>  tty7         2017-06-20 07:15 (:0)
<user1>  pts/2        2017-06-20 07:42 (:0.0)
root     pts/14       2017-06-20 07:05 (<IP1>)
<user1>  pts/16       2017-06-20 07:15 (:0.0)
root     pts/17       2017-06-19 17:15 (<IP2>)
<user2>               2017-06-20 07:39 (<IP3>:2) #VNC
<user1>  pts/26       2017-06-19 18:03 (<IP3>:1.0) #VNC

так что сработало для меня было

su - <user2> -c "DISPLAY=<IP3>:2 notify-send hi"

Я думаю, переключившись на пользователя, вы используете их~/.Xauthority. При авторизации указание работы дисплея.

я использовал другой способ власть до сих пор. Я сделал петлю через~/.Xauthority файлы каждого вошедшего в систему пользователя и собрал их разрешающие куки. После этого работает правая DISPLAY-переменная. Я даже собрал cookie дисплейного менеджера (lightdm в моем случае)

в ~/.Xauthority-файл (после collectiing):

root@mymaching:~# xauth list
<HOSTNAME3>:3  MIT-MAGIC-COOKIE-1  0ebdee59ee015f49066f372b00589420
<HOSTNAME3>:1  MIT-MAGIC-COOKIE-1  74254e326e8904419d005a05a6e95a8c
<HOSTNAME3>/unix:0  MIT-MAGIC-COOKIE-1  54d4cdb35eff20375e486f88e6ac8c74
<HOSTNAME3>:2  MIT-MAGIC-COOKIE-1  c6a07838c7456224799eedfff2be7cd5

мой сценарий до сих пор (я думаю, это еще не окончательно)

#!/bin/bash
users="$(who | awk '{print }' | sort -u | grep -v root)"
rm ~/.Xauthority
touch ~/.Xauthority
for user in $users; do
   xauth_file=/home/$user/.Xauthority
   while read cookie; do
      xauth add $cookie
   done <<< "$(xauth -f $xauth_file  list | grep $HOSTNAME)"
done
for xauth_file in $(find /var/run/lightdm -type f); do
   while read cookie; do
      xauth add $cookie
   done <<< "$(xauth -f $xauth_file  list | grep $HOSTNAME)"
done
for display in $(xauth list | awk '{print }' | cut -d/ -f2); do
   DISPLAY=$display notify-send "$@"
done

легенда: Элементы в анонимизированы. Протокол IPX соответствует HOSTNAMEX

приветы dasBaschdi


мы можем использовать sudo

sudo -u $currentxuser notify-send $message

Совет

мы можем получить текущего пользователя x с помощью этой команды

ps auxw | grep -i screen | grep -v grep | cut -f 1 -d ' '

дополнительно...

currentxuser=$(ps auxw | grep -i screen | grep -v grep | cut -f 1 -d ' ')
echo $currentxuser