GNU/Linux >> Tutoriels Linux >  >> Linux

Exécution de notify-send en tant que root

Le service de notification a été modifié pour ubuntu 14.04 .

Il s'appelle maintenant quelque chose comme org.freedesktop.Notifications.service

Vous pouvez vérifier ici pour plus d'informations sur Notification On Screen Display possibilités.

Vous pouvez également utiliser la ligne de commande suivante pour envoyer vos propres messages

[email protected] ~$ notify-send "Texte du message"

Mettez simplement à jour votre script qui est lancé par udev pour l'utiliser.

Pour contourner le problème lié à l'exécution du notify-send commande en tant que root.

Essayez d'exécuter en tant qu'utilisateur normal, c'est-à-dire

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

J'ai essayé la solution de Fabio A. Cependant, j'ai remarqué que cela ne fonctionnait pas de manière cohérente sur mon installation Arch Linux. Le problème était que who n'a pas affiché le numéro de port pour la session tty1 :

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

J'utilise i3 via exec startx sur mon installation Arch. Par contre, j'ai remarqué que la sortie de who sur une installation de bureau Ubuntu était complètement différente. Ici, le numéro d'affichage est affiché :

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

Je cherchais donc une autre solution pour me débarrasser du who commande. J'ai trouvé que ps aux contient cette entrée utile qui contient à la fois le numéro d'affichage ainsi que le nom d'utilisateur :

$ 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

Voici le nouveau script que j'ai écrit :

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

Tout autre script peut appeler ce script via :

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

En passant :j'utilise dunstify au lieu de notify-send . dunstify a l'avantage de pouvoir attribuer des identifiants à une notification :seule la notification la plus récente pour le même identifiant est affichée.

EDIT :J'avais l'habitude d'interroger le processus "Xorg". Cependant, assez étrangement, j'ai remarqué sur une machine que ce processus était exécuté en tant que root. Je suis passé au processus "xinit" à la place qui fonctionne de la même manière mais semble toujours exécuté par l'utilisateur normal.


Pour envoyer une notification de bureau à partir d'un script d'arrière-plan exécuté en tant que root
(remplacez X_user et X_userid par l'utilisateur et l'ID utilisateur exécutant X respectivement) :

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.'

Cela a été tiré de :https://wiki.archlinux.org/index.php/Desktop_notifications


Combiner la réponse de tomy avec la réponse de hongo à une autre question résout élégamment le problème pour moi.

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

Cette fonction peut être utilisée telle quelle dans n'importe quel script exécuté en tant que root , en remplacement du notify-send commande.


Linux
  1. Utiliser Notify-send avec Cron ?

  2. Comment changer le mot de passe root ?

  3. Comment savoir que je cours dans un chroot ?

  4. Vérifier qu'un script est en cours d'exécution ?

  5. Lors de l'exécution vers un niveau d'exécution, exécute-t-il les niveaux d'exécution précédents ?

Autorisations Linux 101

Mise à jour d'ISPConfig 3.1 vers ISPConfig 3.2

Sur quel shell suis-je en cours d'exécution ?

Exécuter Software-center à partir de la ligne de commande en tant que root ?

Exécuter Pycharm en tant que root depuis le lanceur

L'exécution du script Python via systemd ne parvient pas à charger le module