ubuntuusers.de

Nachricht an alle angemeldeten Benutzer

Status: Gelöst | Ubuntu-Version: Ubuntu 20.04 (Focal Fossa)
Antworten |

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9819

Wohnort: Münster

Gibt es eine Möglichkeit, aus einem Skript eine Nachricht an alle angemeldeten Benutzer eines Systems zu schicken?

So etwas wie früher wall &Co. Allerdings sollen wirklich alle Benutzer erreicht werden, auch jene, welche einen GUI-Desktop verwenden unabhängig davon, ob sie gerade ein Terminal geöffnet haben oder nicht. wall erreicht übrigens ein gnome-terminal nicht, aber vielleicht gibt es eine Alternative?

Tuemmler

Anmeldungsdatum:
26. März 2007

Beiträge: 8075

Wohnort: Süsel / Ostholstein

Moin Moin,

kB schrieb:

Gibt es eine Möglichkeit, aus einem Skript eine Nachricht an alle angemeldeten Benutzer eines Systems zu schicken?

Gibt es eine Grund, warum Du danach trachtest?

Gruß

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1301

Gibt es eine Möglichkeit, aus einem Skript eine Nachricht an alle angemeldeten Benutzer eines Systems zu schicken?

Für Terminal-User hast du die Löung mit "wall" ja schon genannt. Alternative mit "who -a & write" wirst du sicher auch kennen. Das Problem ist, Personen zu erreichen, die über einen X-Server arbeiten und kein Terminal geöffnet haben.

Vor etlichen Jahren hatte ich das Problem mal gelöst, indem ich die Ausgabe von "who -a" nach X-Connections (xserver:123) ausgewertet habe und per xmessage Meldungen geschickt hatte:

DISPLAY=ip-of-xerver:1 xmessage "Testnachricht"

Das sieht eventuell nach heutigen GUI Erwartungen etwas "old-fashion" aus. Heute würde man eventuell "notify-send" verwenden.

Ein Tool, dass deine Anforderungen komplett abdeckt ist mir nicht bekannt.

PS: ... und noch ein Beispiel ...

who -a | grep -o "(.*)" | tr -d '()' | while read x; do DISPLAY=$x notify-send --urgency=critical -i testicon.png "Das ist eine Testnachricht" && aplay alarm.wav; done

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14393

shiro schrieb:

DISPLAY=ip-of-xerver:1 xmessage "Testnachricht"

Das sieht eventuell nach heutigen GUI Erwartungen etwas "old-fashion" aus.

Ist es nicht auch so, dass für xmessage, bei jedem user/Benutzer Xorg auf dem TCP-Port 6000 lauschen muss?

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1301

Ist es nicht auch so, dass für xmessage, bei jedem user/Benutzer Xorg auf dem TCP-Port 6000 lauschen muss?

Radio Eriwan: Im Prinzip ja, aber ...

Man kann mit xhost arbeiten aber auch über ssh. Letztere hatte ich gemacht. Eine Liste von Workstations und Servern, auf denen sich X-Sessions tummelten wurden sequentiell per ssh abgearbeitet. Der ssh-user hatte dann die erforderlichen Rechte. Man will ja nicht durch jeden gestört werden...

kB Team-Icon

Supporter, Wikiteam
(Themenstarter)
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9819

Wohnort: Münster

Danke für die Hinweise auf xmessage und notify-send.

xmessage kommt nicht in Frage, weil es ja natürlich auch bei Desktops unter Wayland funktionieren soll.

notify-send sieht vom Konzept vielversprechend aus. Allerdings ist wohl die Entwicklung vor vielen Jahren stehen geblieben und ich habe es nicht auf Anhieb geschafft, eine Kommunikation VT → Desktop oder Systemdienst → Desktop zu realisieren. In der Dokumentation habe ich leider auch kein Beispiel gefunden.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11275

Wohnort: München

notify-send funktioniert über den DBus Session Bus - davon hat jeder Nutzer im Rahmen seiner Session eine eigene Instanz (unter Ubuntu ist das üblicherweise /run/user/${UID}/bus) - den Wert kann man aus der Variable $DBUS_SESSION_BUS_ADDRESS einer laufenden Sitzung bekommen.

Also könnte man z.B. sowas als root laufen lassen (vgl. Desktop_notifications):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/usr/bin/bash
while IFS= read -d $'\0' dbus_socket
do
    dbus_address="unix:path=${dbus_socket}"
    uid=$(grep -Po "(?<=/)\d{4}(?=/)" <<< "$dbus_socket") # normal users have a UID >= 1000
    [[ $uid ]] || continue
    user=$(id -nu $uid)
    [[ $user ]] || continue
    sudo -u "$user" DBUS_SESSION_BUS_ADDRESS="$dbus_address" notify-send 'Hello world!' 'This is an example notification.'
done < <(find /run/user/ -name bus -type s -print0 2>/dev/null)  # search for existing Session-Bus DBus sockets

schragge

Anmeldungsdatum:
27. Januar 2022

Beiträge: 181

^ Ich würde das ein bisschen vereinfachen

1
2
3
4
5
6
while read uid dbus_address
do
  sudo -u "#$uid" DBUS_SESSION_BUS_ADDRESS="$dbus_address" \
    notify-send 'Notice from admin' \
    'The system is going to shutdown in five minutes'
done < <(find /run/user -uid +999 -uid -60000 -name bus -type s -printf '%U unix:path=%p\n' 2>/dev/null)

kB Team-Icon

Supporter, Wikiteam
(Themenstarter)
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9819

Wohnort: Münster

seahawk1986 schrieb:

[…] vgl. Desktop_notifications

Danke für diesen Hinweis! Das hilft mir weiter.

Antworten |