Notification, script bash & privilèges root

Tags: #<Tag:0x00007f63f6254a98>

Bonjour les amis !

Je viens partager avec vous une découverte (en tout cas pour moi peut-être que d’autres connaissent) parce que même avec les sites en anglais qui mentionnent ce problème sur le script bash je n’ai trouvé aucun qui donne la solution à ce problème, il a fallu que je combine plusieurs réponses et que je cherche à comprendre pour ça.

Avant toute chose, quand vous faites un script bash on peut aisément faire une notification à l’utilisateur de cette manière :

notify-send "Le titre du message" "Le message que je veux faire passer à l'utilisateur"

Il me semble que « notify-send » se trouve sur presque tous les environnements de bureau linux, en tout cas je l’ai testé sur Xubuntu, Fedora (gnome) et sur Neon-KDE, il y est à chaque fois de base.

Mon problème c’est que lorsque dans un script que l’utilisateur doit exécuter, si le script doit s’exécuter avec des privilèges root c’est l’enfer !!! :fire::smiling_imp: :fire:
Et oui, reprenez cette même ligne de commande dans un script bash et exécutez-la avec sudo et vous obtiendrez une erreur bien chelou :crazy_face:

#!/bin/bash
notify-send "Le titre du message" "Le message que je veux faire passer à l'utilisateur"

Résultat :

GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.Notifications was not provided by any .service files

Et j’ai vu pas mal de postes en français et en anglais où certains se tirent les cheveux et d’autres même se cassent bien les dents dessus. Surtout ceux qui ont essayé la même chose avec « zenity ». :woozy_face:

Personnellement quand je cherche à trouver une solution j’évite de devoir installer des choses en plus, surtout dans ce cas parce que mon script sert à faire une mise à jour d’un programme pour entretenir des debians de tout mon entourage (Debian Automation Repair & Clean) et je n’avais pas envie de me taper une installation différente par environnement de bureau… Alors j’ai cherché une solution pour que ça fonctionne sur tous les postes et ce peu importe l’environnement de bureau.

La solution (ne la mettez pas dans un terminal elle ne fonctionne pas normalement, cela fonctionne seulement dans un script bash exécuté avec des privilèges root.):

#!/bin/bash
sudo -u "${SUDO_USER}" DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u "${SUDO_USER}")/bus notify-send "Le titre du message" "Le message que je veux faire passer à l'utilisateur"

Pour ceux qui veulent comprendre :
De ce que j’ai compris c’est que lorsque le script est exécuté avec des privilèges root, « notify-send » a besoin d’informations du « bus », des infos que l’application n’arrive pas à obtenir, bien souvent ce fichier n’existe pas (/run/user/0/bus), surement que cela dépend de l’utilisateur et de ce qu’il a fait avec son compte root. Mais dans tous les cas c’est accessible avec le compte utilisateur normal qui dans son fichier à lui « /run/user/1000/bus » a l’info. J’imagine qu’en tant normal les services exécutés avec des privilèges donnent cette information d’où le message d’erreur, parce que dans plusieurs de mes environnements de bureau « /run/user/0/bus » n’existe pas.
Donc c’est simplement parce qu’on exécute en privilège root que l’on change d’environnement, pour s’en rendre compte il suffit d’exécuter la commande « env » dans un terminal une fois avec sudo et une fois sans, et on remarque que l’environnement root ne donne pas l’info de la variable « DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus ».

N’hésitez à tester et me donner des retours en me précisant votre environnement de bureau pour savoir ce qui peut être amélioré. Merci d’avance :wink:

Il me semble que c’est comme ça qu’il faut faire pour notify-send (et toute autre commande qui doit utiliser dbus).

1 J'aime