сповіщення-відправлення іншому користувачеві в тій же системі


11

Чи можна використовувати сповіщення-відправлення для надсилання повідомлень іншим користувачам у системі?
бажано, щоб вказаний користувач, але система широко працювала б також.

Ubuntu / Debian із встановленим libnotify


Дивіться цю відповідь на прикладі, який працює з Ubuntu 16.04, навіть із скрипту, запущеного root у crontab.
mivk

Відповіді:


6

Якщо у вас є пароль інших користувачів, ви можете це зробити sudo -u somedude notify-send Hello. колись повинен бути запущений X-сеанс.

Редагувати: знайшов цей скрипт для використання з cron:

#!/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin
export DISPLAY=:0.0
export $(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -session)/environ )
TIME=$1
shift
/usr/bin/notify-send -t 36000 $1 $2

з незначною модифікацією, що сценарій робить те, що мені потрібно для цього, дякую
madmaze

ви не пропустили жодного дефісу раніше -session?
vladkras

жоден @vladkras pgrepне повинен отримувати pid диспетчера X-сеансів, тобто lxde-сесія, gnome-сесія тощо. Цей сценарій в кращому випадку є грубим хаком і багато що залежить від налаштування вашої системи. Це спрацювало, коли я відповів, але не працює без змін зараз, через 5 років.
micke

Не працює і для мене
vladkras

2

Якщо користувачі перебувають на терміналах, будуть використані наступні команди -

write user [tty]

або надіслати всім користувачам

wall


0

Мені знадобився подібний інструмент для надсилання повідомлень на всі сеанси. Ось моє рішення: https://unix.stackexchange.com/a/230062/93227

Він сканує / proc, щоб знайти всі автобуси сеансу, а потім він виконує сповіщення-відправлення на кожному з них (один раз на шину). Усі аргументи передаються без змін до реального повідомлення-відправки.

#!/bin/bash

/bin/grep -sozZe '^DBUS_SESSION_BUS_ADDRESS=[a-zA-Z0-9:=,/-]*$' /proc/*/environ \
| /usr/bin/php -r '
        $busses = array();
        array_shift($argv);
        while($ln = fgets(STDIN)) {
                list($f, $env) = explode("\0", $ln, 2);
                if (file_exists($f)) {
                        $user = fileowner($f);
                        $busses[$user][trim($env)] = true;
                }
        }
        foreach ($busses as $user => $user_busses) {
                foreach ($user_busses as $env => $true) {
                        if (pcntl_fork()) {
                                posix_seteuid($user);
                                $env_array = array("DBUS_SESSION_BUS_ADDRESS" => preg_replace("/^DBUS_SESSION_BUS_ADDRESS=/", "", $env));
                                pcntl_exec("/usr/bin/notify-send", $argv, $env_array);
                        }
                }
        }
' -- "$@"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.