Über die Befehlszeile möchte ich auf jeder laufenden X-Anzeige eine Benachrichtigung anzeigen. (und laufende Konsole)
Etwas wie:
notify-send-all 'Warning' 'Nuclear launch in 5 minutes, please evacuate'
Gibt es ein Programm, das dies erledigt? Wenn nicht, kann dies mit bash implementiert werden?
command-line
xorg
tty
console
notifications
Stefan
quelle
quelle
Antworten:
Über die Befehlszeile können Sie eine Nachricht an alle Konsolen senden.
Für das Versenden von Benachrichtigungen unter X gibt es notify-send, das auf der aktuellen Anzeige eine Benachrichtigung an den aktuellen Benutzer sendet. (Aus Ihrer Frage geht hervor, dass Sie diese bereits kennen.) Darauf können Sie mit einigen Bash-Skripten aufbauen. Grundsätzlich muss man herausfinden, welche Benutzer sich auf welchen X-Displays befinden. Sobald Sie diese Informationen erhalten haben, können Sie notify-send wie folgt verwenden:
Wobei fschmitt der Benutzer bei Anzeige 0 ist. Sie können die Ausgabe des Befehls "who" analysieren, um alle Benutzer und ihre Anzeigen zu finden. Die Ausgabe sieht so aus
Sie sehen, es gibt zwei Benutzer, die X-Sitzungen ausführen, markmerk3 bei Anzeige 0 und seamonkey bei Anzeige 1. Ich denke, Sie müssen nach tty [0-9] * greifen und dann sicherstellen, dass am Ende der Zeile (: [0 -9.] *), Um die Konsolenanmeldungen zu entfernen und die Anzeige-ID aus der Zeichenfolge in Klammern zu extrahieren.
quelle
who
teilt Ihnen mit, wer angemeldet ist und auf welcher X-Anzeige sich diese Anmeldung befindet. Möglicherweise müssen Sie es etwas filtern.who | awk '/\(:[0-9]+\)/ {gsub("[:|(|)]","");print "DISPLAY=:"$5 " sudo -u " $1 " notify-send \"Message\""}' | bash
. Vielleicht möchten Sie auch unix.stackexchange.com/questions/1596/…Dieser Thread ist ein bisschen alt, sorry, aber ich hoffe, dass ich dem Thema noch etwas Nützliches hinzufügen kann. (auch Josef Kufner hat ein schönes Skript geschrieben, es war für meinen Geschmack etwas zu lang und es benutzt PHP)
Ich brauchte auch ein Tool wie in der ursprünglichen Frage beschrieben (um eine Nachricht an alle aktiven X-Benutzer zu senden). Und basierend auf den Antworten hier habe ich dieses kleine Nur-Bash-Skript geschrieben, das nach aktiven X-Benutzern sucht (mit 'who') und dann notify-send für jeden aktiven Benutzer ausführt.
Und das Beste: Sie können mein Skript mit all seinen Parametern genauso verwenden wie "notify-send"! ;-)
benachrichtige-sende-alles:
Kopieren Sie den obigen Code in eine Datei mit dem Namen "notify-send-all", machen Sie ihn ausführbar und kopieren Sie ihn nach / usr / local / bin oder / usr / bin (wie Sie möchten). Dann starte es zB als root in einer Konsolensitzung wie folgt:
notify-send-all -t 10000 "Warning" "The hovercraft is full of eels!"
Ich benutze es jetzt mehrere Monate auf verschiedenen Computern und hatte bisher keine Probleme. Ich habe es mit MATE- und Cinnamon-Desktops getestet. Läuft auch erfolgreich in Cron und Anacron.
Ich habe dieses Skript für / unter ArchLinux geschrieben. Bitte teilen Sie mir mit, wenn Sie Probleme mit anderen Linux-Distributionen oder -Desktops haben.
quelle
|egrep
?? ist egrep ein befehl?awk '{print $1$5}'
ist es besser, es zu verwendenawk '{print $1$NF}'
, damit es bei einigen Gebietsschemata, bei denen das Datum mit Leerzeichen formatiert ist (z . B.Jun 3
anstelle von2017-06-03
), nicht unterbrochen wird . Hier ist auch eine Version, um bestimmte Benutzer anstelle aller Benutzer zu benachrichtigen: gist.github.com/shvchk/ba2f0da49bf2f571d6bf606d96f289d7grep -E
und hinzugefügt wurde/bin
(siehe Bearbeiten). Sie könnenIch brauchte dies auch für einige systemweite Benachrichtigungen. Hier ist meine Lösung. Es scannt / prozessiert, um alle Sitzungsbusse zu finden, und führt dann auf jedem davon eine Benachrichtigung aus (einmal pro Bus). Alle Argumente werden unverändert an real notify-send übergeben.
quelle
In Ubuntu 16.04 wollte ich Benachrichtigungen von einem Skript, das als root von crontab ausgeführt wird. Nach dem Setzen der Umgebungsvariablen hat
sudo -u $user
es aus irgendeinem Grund nicht funktioniert,sh -c "..." $user
funktioniert aber .Also benutze ich jetzt diese Funktion:
Wie Sie die Variable DBUS_SESSION_BUS_ADDRESS finden, hängt wahrscheinlich von Ihrer Verteilung ab. In Ubuntu 16.04 ist es in
/run/user/$UID/dbus-session
, die einfach bezogen werden kann.id -u
wird in der obigen Funktion verwendet, um die UID des von zurückgegebenen Benutzernamens zu ermittelnwho
.quelle
Hier ist ein Update von Andys Skript: Die Art und Weise, wie das ermittelt wurde,
DBUS_SESSION_BUS_ADDRESS
funktioniert unter Centos 7 nicht. Außerdem listete derwho
Befehl einige Sitzungen aus irgendeinem Grund nicht auf, sodass ichps aux
stattdessen die Ausgabe analysiere . In diesem Skript wird davon ausgegangennxagent
, dass Benutzer mit X2GO ( ) angemeldet sind , die Anpassung für andere Fälle sollte jedoch einfach sein.quelle
quelle