GNU/Linux >> Znalost Linux >  >> Linux

Spuštění notify-send jako root

Služba oznámení byla změněna pro ubuntu 14.04 .

Říká se tomu něco jako org.freedesktop.Notifications.service

Zde můžete zkontrolovat další informace o Notification On Screen Display možnosti.

Také můžete použít následující příkazový řádek k odeslání vlastních zpráv

[email protected] ~$ notify-send “Text zprávy”

Stačí aktualizovat skript, který spouští udev používat.

Chcete-li vyřešit problém související se spuštěním notify-send příkaz jako root.

Pokuste se spustit jako váš běžný uživatel, tj.

su <YOURUSER> -c 'notify-send “Text of message”'

Zkoušel jsem řešení Fabia A. Všiml jsem si však, že to nefungovalo konzistentně na mé instalaci Arch Linuxu. Problém byl v tom, že who nezobrazilo číslo portu pro relaci tty1:

$ who
john       tty1         2021-03-21 09:02

Používám i3 přes exec startx na mé instalaci Arch. Na druhou stranu jsem si všiml, že výstup who na desktopu Ubuntu vypadala instalace úplně jinak. Zde se zobrazí číslo displeje:

$ who
john       :0           2021-03-21 09:49 (:0)

Hledal jsem tedy jiné řešení, jak se zbavit who příkaz. Našel jsem, že ps aux obsahuje tento užitečný záznam, který obsahuje jak zobrazované číslo, tak uživatelské jméno:

$ ps aux | grep xinit
john 785 763 0 19:14 tty1 S+ 0:00 xinit /home/john/.xinitrc -- /etc/X11/xinit/xserverrc :0 vt1 -keeptty -auth /tmp/serverauth.gGcqw2rJXG

Toto je nový skript, který jsem napsal:

#/bin/bash

xinit_pid=$(pgrep xinit)

if [ -n "xinit_pid" ]; then
    xinit_ps=$(ps --no-headers -f $xinit_pid | head -n 1)
    display=$(echo "$xinit_ps" | grep -Po " :[0-9]+ " | tr -d " ")
    user=$(echo "$xinit_ps" | cut -d " " -f 1)
    uid=$(id -u $user)
    echo "Display environment: $display $user $uid"
    sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus notify-send "[email protected]"
else
    echo "Warning: Could not find xinit process!"
fi

Jakýkoli jiný skript může volat tento skript pomocí:

bash /opt/notify-send-helper Title Message -t 5000

Na okraj:Používám dunstify místo notify-send . dunstify má tu výhodu, že může k oznámení přiřadit ID:Zobrazí se pouze nejnovější oznámení pro stejné ID.

EDIT:Použil jsem dotaz na proces "Xorg". Kupodivu jsem si však na jednom počítači všiml, že tento proces byl spuštěn jako root. Místo toho jsem přešel na proces "xinit", který funguje stejně, ale zdá se, že jej vždy spouští normální uživatel.


Odeslání upozornění na plochu ze skriptu na pozadí spuštěného jako root
(nahraďte X_user a X_userid uživatelem a ID uživatele se systémem 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.'

Toto bylo převzato z:https://wiki.archlinux.org/index.php/Desktop_notifications


Kombinace Tomyho odpovědi s Hongoovou odpovědí na jinou otázku pro mě elegantně řeší problém.

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 $1}' | head -n 1)

    #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 "[email protected]"
}

Tuto funkci lze použít tak, jak je, v libovolném skriptu běžícím jako root , jako náhrada za notify-send příkaz.


Linux
  1. Používáte Notify-Send s Cronem?

  2. Jak změníme heslo root?

  3. Jak zjistit, že běžím v Chrootu?

  1. Kontrola, zda skript běží?

  2. Spuštění softwarového centra z příkazového řádku jako root?

  3. Jak vypsat spuštěné relace obrazovky?

  1. Cron s upozorněním-odeslat

  2. Obnovení hesla root

  3. Jak zjistit, zda httpd běží nebo ne pomocí příkazového řádku?