GNU/Linux >> Tutoriales Linux >  >> Linux

Ejecutando notificar-enviar como root

Se ha cambiado el servicio de notificaciones para ubuntu 14.04 .

Ahora se llama algo así como org.freedesktop.Notifications.service

Puede consultar aquí para obtener más información sobre Notification On Screen Display posibilidades.

También puede usar la siguiente línea de comando para enviar sus propios mensajes

[email protected] ~$ notificar-enviar “Texto del mensaje”

Simplemente actualice su secuencia de comandos que se lanzará por udev para usarlo.

Para solucionar el problema relacionado con la ejecución de notify-send comando como root.

Intente ejecutar como su usuario normal, es decir,

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

Probé la solución de Fabio A. Sin embargo, noté que no funcionaba de manera consistente en mi instalación de Arch Linux. El problema fue que who no mostró el número de puerto para la sesión tty1:

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

Estoy ejecutando i3 a través de exec startx en mi instalación de Arch. Por otro lado, noté que la salida de who en una instalación de escritorio de Ubuntu se veía completamente diferente. Aquí se muestra el número de pantalla:

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

Así que estaba buscando otra solución para deshacerme del who dominio. Encontré que ps aux contiene esta entrada útil que contiene tanto el número de visualización como el nombre de usuario:

$ 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

Este es el nuevo guión que escribí:

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

Cualquier otro script puede llamar a este script a través de:

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

En una nota al margen:estoy usando dunstify en lugar de notify-send . dunstify tiene la ventaja de poder asignar ID a una notificación:solo se muestra la notificación más reciente para la misma ID.

EDITAR:solía consultar el proceso "Xorg". Sin embargo, por extraño que parezca, noté en una máquina que este proceso se ejecutaba como root. Cambié al proceso "xinit", que funciona igual pero parece que siempre lo ejecuta el usuario normal.


Para enviar una notificación de escritorio desde un script en segundo plano que se ejecuta como raíz
(reemplace X_user y X_userid con el usuario y el ID de usuario que ejecutan X respectivamente):

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

Esto fue tomado de:https://wiki.archlinux.org/index.php/Desktop_notifications


Combinar la respuesta de tomy con la respuesta de hongo a otra pregunta me resuelve el problema de manera elegante.

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

Esa función se puede usar tal cual en cualquier script que se ejecute como root , como reemplazo directo del notify-send comando.


Linux
  1. Protección contra la ejecución de tareas en nombre de root en Plesk 12

  2. ¿Usando Notify-send con Cron?

  3. ¿En qué shell me estoy ejecutando?

  4. ¿Cómo saber que estoy corriendo en un Chroot?

  5. ¿Comprobar que se está ejecutando un script?

Actualización de ISPConfig 3.1 a ISPConfig 3.2

Restablecer una contraseña raíz de MySQL

Cron con notificación-envío

Recuperación de la contraseña raíz

¿Cómo saber si httpd se está ejecutando o no a través de la línea de comandos?

Solicitar al usuario que inicie sesión como root cuando ejecute un script de shell