如何使用notify-send以root身份通知用户?

如何使用notify-send以root身份通知用户?
#!/bin/bash
export DISPLAY=:0
state=$(upower -i $(upower -e | grep BAT) | grep --color=never -E "state" )
stat=${state:25:32}
batperct=$(upower -i $(upower -e | grep '/battery') | grep  -E "percentage:")
bat=${batperct:24:26}
intbat=$(echo $bat | cut -d'%' -f1)
if [ "$intbat" -lt "15" -a "$stat" == "discharging" ]; then
    notify-send 'battery low..! please plugin charger..... charge is only' "$intbat"    
fi  

当以普通用户 ( ) 身份运行时,脚本运行良好bash script.sh。将显示桌面通知。

root如果我运行它sudo bash script.sh,桌面通知是不是显示。

如何以 root 身份使用 notification-send 通知用户?

我正在使用 Arch Linux。

答案1

该命令notify-send需要设置环境变量DBUS_SESSION_BUS_ADDRESS,并且必须以该会话总线的所有者作为用户来调用。

在以下脚本中,该函数notify_users搜索控制会话总线的所有 dbus 守护进程。这种守护进程的命令行如下所示:

dbus-daemon --fork --session --address=unix:abstract=/tmp/dbus-ceVHx19Kiy

对于此进程,所有者和 dbus 地址已确定。然后我们就可以使用notify-send.此脚本应通知所有使用 GDM 会话登录的用户。但我从未测试过。

注意:如果您将其称为非 root,则可能会因使用sudo.

#!/bin/bash

# Inform all logged on users
# Usage: notify_users TITLE MESSAGE [urgency [icon]]
notify_users()
{
    typeset title="$1"
    typeset message="$2"
    typeset urgency="${3:-critical}"
    typeset icon="${4:-}"

    case "$urgency" in
        "low") : ;;
        "normal") : ;;
        "critical") : ;;
        *)
            urgency="normal"
            ;;
    esac

    typeset ls user bus_addr

    typeset IFS=$'\n'

    # for all dbus-daemon processes that create a session bus
    for ln in "$(ps -eo user,args | grep "dbus-daemon.*--session.*--address=" | grep -v grep)"; do
        # get the user name
        user="$(echo "$ln" | cut -d' ' -f 1)"
        # get dbus address
        bus_addr="$(echo "$ln" | sed 's/^.*--address=//;s/ .*$//')"
        # run notify-send with the correct user
        DBUS_SESSION_BUS_ADDRESS="$bus_addr" sudo -u $user -E /usr/bin/notify-send -u "$urgency" -i "$icon" "$title" "$message"
    done
}

state="$(upower -i $(upower -e | grep BAT))"

# if the state contains the word "discharging"
if [[ "$state" = *discharging* ]]; then

    perc=$(echo "$state" | grep "percentage" | awk '{print $2}' | tr -d '%')

    icon="$(echo "$state" | grep "icon-name:" | awk '{print $2}' | tr -d "'\"" )"

    if [ "$perc" -lt 15 ]; then
        notify_users "Battery Low!"  "Please plugin charger ... charge is only $perc%" "critical" "$icon"
    fi
fi

相关内容