Как использовать notify-send для уведомления пользователей с правами root?

По сути, вам нужно установить загрузчик GRUB в MBR USB-накопителя. Сейчас он установлен в MBR основного диска на ПК.

На данный момент самый простой способ сделать это:

  1. Загрузите Debian на ПК; единственный, на котором настроена загрузка
  2. После входа в систему убедитесь, что файловая система /boot смонтирована. Если это не так, продолжайте и установите его.
  3. Затем от имени пользователя root запустите :grub-install /dev/sdX, где X соответствует USB-накопителю. Это установит загрузчик в MBR на USB-накопителе.

Чтобы уточнить, загрузчик GRUB будет установлен на диск до таблицы разделов, за пределами ваших трех контейнеров LUKS; сделать его загрузочным.

Подробнее об установке GRUB можно прочитать здесь . Так получилось, что документация Gentoo Linux по этой теме довольно исчерпывающая.

3
05.01.2019, 22:53
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
3
27.01.2020, 21:24

Теги

Похожие вопросы