GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Benachrichtigen-Senden als root ausführen

Der Benachrichtigungsdienst wurde für ubuntu 14.04 geändert .

Es heißt jetzt so etwas wie org.freedesktop.Notifications.service

Weitere Informationen zu Notification On Screen Display finden Sie hier Möglichkeiten.

Sie können auch die folgende Befehlszeile verwenden, um Ihre eigenen Nachrichten zu senden

[email protected] ~$ benachrichtigen-senden „Text der Nachricht“

Aktualisieren Sie einfach Ihr Skript, das von udev gestartet wird um es zu verwenden.

Zur Umgehung des Problems im Zusammenhang mit der Ausführung von notify-send Befehl als root.

Versuchen Sie, es als Ihr normaler Benutzer auszuführen, d. h.

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

Ich habe die Lösung von Fabio A ausprobiert. Ich habe jedoch festgestellt, dass es auf meiner Arch-Linux-Installation nicht konsistent funktionierte. Das Problem war, dass who hat die Portnummer für die tty1-Sitzung nicht angezeigt:

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

Ich verwende i3 über exec startx auf meiner Arch-Installation. Andererseits ist mir aufgefallen, dass die Ausgabe von who auf einer Ubuntu-Desktop-Installation sah das ganz anders aus. Hier wird die Anzeigenummer angezeigt:

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

Also suchte ich nach einer anderen Lösung, um den who loszuwerden Befehl. Ich habe das ps aux gefunden enthält diesen nützlichen Eintrag, der sowohl die Anzeigenummer als auch den Benutzernamen enthält:

$ 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

Dies ist das neue Skript, das ich geschrieben habe:

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

Jedes andere Skript kann dieses Skript aufrufen über:

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

Nebenbei bemerkt:Ich verwende dunstify statt notify-send . dunstify hat den Vorteil, einer Benachrichtigung IDs zuordnen zu können:Es wird nur die neuste Benachrichtigung für dieselbe ID angezeigt.

EDIT:Früher habe ich den Prozess "Xorg" abgefragt. Seltsamerweise bemerkte ich jedoch auf einer Maschine, dass dieser Prozess als root ausgeführt wurde. Ich habe stattdessen zum "xinit"-Prozess gewechselt, der genauso funktioniert, aber anscheinend immer vom normalen Benutzer ausgeführt wird.


So senden Sie Desktop-Benachrichtigungen von einem Hintergrundskript, das als Root ausgeführt wird
(Ersetzen Sie X_user und X_userid durch den Benutzer bzw. die Benutzer-ID, die X ausführen):

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

Dies wurde entnommen aus:https://wiki.archlinux.org/index.php/Desktop_notifications


Die Kombination von Tomys Antwort mit Hongos Antwort auf eine andere Frage löst das Problem für mich elegant.

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

Diese Funktion kann unverändert in jedem Skript verwendet werden, das als root ausgeführt wird , als Drop-in-Ersatz für notify-send Befehl.


Linux
  1. Wie ändern wir das Root-Passwort?

  2. Wie erkenne ich, dass ich in einem Chroot laufe?

  3. Überprüfen, ob ein Skript ausgeführt wird?

  4. Werden beim Ausführen zu einem Runlevel vorherige Runlevel ausgeführt?

  5. Datei kann nicht gelöscht werden, auch wenn sie als Root ausgeführt wird?

Linux-Berechtigungen 101

Aktualisieren von ISPConfig 3.1 auf ISPConfig 3.2

Cron mit Notify-Send

Root-Passwort wiederherstellen

Wie kann ich über die Befehlszeile herausfinden, ob httpd ausgeführt wird oder nicht?

Fordert den Benutzer auf, sich als Root anzumelden, wenn ein Shell-Skript ausgeführt wird