GNU/Linux >> Linux Esercitazione >  >> Linux

Esecuzione di notify-send come root

Il servizio di notifica è stato modificato per ubuntu 14.04 .

Ora si chiama smth come org.freedesktop.Notifications.service

Puoi controllare qui per ulteriori informazioni su Notification On Screen Display possibilità.

Inoltre puoi utilizzare la seguente riga di comando per inviare i tuoi messaggi

[email protected] ~$ notify-send “Testo del messaggio”

Aggiorna semplicemente il tuo script che viene lanciato da udev per usarlo.

Per aggirare il problema relativo all'esecuzione del notify-send comando come root.

Prova a eseguire come utente normale, ovvero

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

Ho provato la soluzione di Fabio A. Tuttavia, ho notato che non funzionava in modo coerente sulla mia installazione di Arch Linux. Il problema era quel who non mostrava il numero di porta per la sessione tty1:

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

Sto eseguendo i3 tramite exec startx sulla mia installazione Arch. D'altra parte, ho notato che l'output di who su un'installazione desktop di Ubuntu sembrava completamente diversa. Qui viene mostrato il numero del display:

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

Quindi stavo cercando un'altra soluzione per sbarazzarmi di who comando. Ho trovato quel ps aux contiene questa voce utile che contiene sia il numero visualizzato che il nome utente:

$ 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

Questo è il nuovo script che ho scritto:

#/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

Qualsiasi altro script può chiamare questo script tramite:

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

Nota a margine:sto usando dunstify invece di notify-send . dunstify ha il vantaggio di poter assegnare ID a una notifica:viene mostrata solo la notifica più recente per lo stesso ID.

EDIT:ero solito interrogare il processo "Xorg". Tuttavia, stranamente ho notato su una macchina che questo processo è stato eseguito come root. Sono invece passato al processo "xinit" che funziona allo stesso modo ma sembra essere sempre eseguito dall'utente normale.


Per inviare una notifica sul desktop da uno script in background eseguito come root
(sostituisci X_user e X_userid con l'utente e l'id utente che eseguono rispettivamente 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.'

Questo è stato preso da:https://wiki.archlinux.org/index.php/Desktop_notifications


La combinazione della risposta di tomy con la risposta di hongo a un'altra domanda risolve elegantemente il problema per me.

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]"
}

Tale funzione può essere utilizzata così com'è in qualsiasi script eseguito come root , in sostituzione immediata del notify-send comando.


Linux
  1. Come cambiamo la password di root?

  2. Come dire che sto correndo in un Chroot?

  3. Quando si esegue a un livello di esecuzione, esegue livelli di esecuzione precedenti?

  4. Impossibile eliminare il file, anche durante l'esecuzione come root?

  5. Esecuzione di Software-center dalla riga di comando come root?

Aggiornamento di ISPConfig 3.1 a ISPConfig 3.2

Come elencare le sessioni dello schermo in esecuzione?

Cron con notifica-invio

Recuperare la password di root

Come scoprire se httpd è in esecuzione o meno tramite la riga di comando?

Richiedi all'utente di accedere come root durante l'esecuzione di uno script di shell