Linux: Wie sende ich eine Nachricht an einen lokalen Benutzer, der bei X11 angemeldet ist?

Ist es möglich, eine Nachricht (Popup-Fenster oder ähnliches) an einen lokalen Benutzer zu senden, der von der Konsole aus bei X (xdm, fluxbox) angemeldet ist ? Beispiel: user1 wird protokolliert und verwendet X / fluxbox, user2, um sich mit ssh an der Konsole bei derselben Box anzumelden. Nun-was muss user2 tun, um eine Nachricht an user1 zu senden ?

 11
Author: marioosh, 2011-07-13

4 answers

Mit dem Werkzeug xmessage können Sie genau das tun; Präsentieren Sie Benutzern ein Popup-Fenster mit einer darin enthaltenen Textnachricht.

Beispiel: user2 meldet sich in einer BASH-Sitzung auf der Box an und gibt Folgendes aus:

export DISPLAY=':0.0'
xmessage "some message here"

Wenn Sie sich in einer TSCH-Sitzung anmelden, wäre dies ungefähr so:

setenv DISPLAY ':0.0'
xmessage "some message here'

Alternativ können Sie Nachrichten auf zwei Arten an Terminalsitzungen senden:

Verwendung wall (=alle warnen, [Benutzer])

Von der Manpage:
Wand zeigt den Inhalt der Datei oder, standardmäßig, seine standard-Eingang, auf die Terminals aller aktuell angemeldeten Benutzer.

Wenn Sie auf einen bestimmten Benutzer abzielen möchten, verwenden Sie write. Wieder sagt uns der Mensch:

Mit dem Dienstprogramm write können Sie mit anderen Benutzern kommunizieren, indem Sie Zeilen von Ihrem Terminal in ihr Terminal kopieren.

 17
Author: mjk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2011-07-13 09:02:50

In der Regel werden X11-Sitzungen normalerweise in einem "privaten" Modus gestartet, sodass Sie eines von zwei Dingen benötigen: entweder die Zusammenarbeit von user2, damit Sie auf ihre Bildschirme zugreifen können, oder Superuser-Berechtigungen, um in ihre Bildschirme einzudringen.

GEFAHR: Denken Sie daran, sobald Sie Zugriff auf den Bildschirm haben, können Sie auch Tastenanschläge (möglicherweise einschließlich Passwörter) erfassen und Screenshots machen, sodass dies ein großes Sicherheitsrisiko darstellt.

In die meisten Fälle es ist vorzuziehen, stattdessen ein messaging-tool oder chat-Programm für diese Dinge.

Vorbehalte beiseite:

Coöperating

Wenn user2 user1 erlauben möchte, auf ihren Bildschirm zuzugreifen, muss user2 zuerst einen Befehl ausgeben wie:

 xhost +si:localuser:user1

Das könnte Hinzugefügt werden, um ein start-up-Skript von einer Art, ich weiß nicht, Fluxbox, aber ich nehme an, es hat ein rc oder session-start hook.

Sobald dies ausgegeben wurde, kann user1 in die Anzeige von user2 schreiben, wenn Sie es finden können.

Wenn user2 dies weiß, können sie es immer auf andere Weise an user1 senden.

Die Anzeige eines anderen Benutzers finden

Auf einer typischen Workstation ist es ungewöhnlich, dass mehr als ein oder zwei Benutzer angemeldet sind; In diesem Fall könnte das "Erraten", dass die gewünschte Anzeige 0, 1 oder vielleicht 2 ist, eine praktikable Lösung sein.

Für eine vollständigere Lösung nehmen wir jedoch an, dass Sie einen Computer haben, auf dem sehr viele Benutzer signiert werden können in, und versuchen, die zu finden, die Sie wollen.

for proc in /proc/[0-9]*/
do
     if [ Xorg = $(< $proc/comm ) ] 2>/dev/null && \
        [ $(id -u user2) -eq $(< $proc/loginuid) ] 2>/dev/null
     then
        for subproc in $(
        do
            echo "user2 display=" $(perl -ne 'if (m,DISPLAY=(.*)\0,) { print $1 }' < $subproc/environ)
        done
     fi
done

Dann kann user1 endlich (mit dem oben erhaltenen Anzeigewert; Ich habe gerade :14.0 hier geschrieben...)

DISPLAY=:14.0 xmessage "Hello, user2"

Senden einer Benachrichtigung statt

Im Interesse der Vollständigkeit funktioniert zumindest auf Gnome Desktop Folgendes. Ich weiß nicht, ob Fluxbox ein Benachrichtigungs-Widget hat.

 DISPLAY=:14.0 notify-send "Hello, user2"

Dies hat viel benutzerfreundlichere Optionen für die Anzeige und wird wahrscheinlich auf eine eher freundlichere Weise auf der bildschirm des Benutzers.

 2
Author: BRPocock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-08-29 21:32:18

Dies ist ein etwas" aus dem wall " Vorschlag.

Installiere espeak (oder espeak-ng) auf dem Zielcomputer von deinem ssh execute

 espeak "The matrix has you"

Espeak ist eine Text - to-Speech-Engine und wird an die Lautsprecher der Konsole ausgegeben. Wenn die Lautstärke nicht auf Null gesetzt ist, spricht der Computer mit dem lokalen Benutzer.

 1
Author: James K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-06-13 11:39:31

Für alle, die notify-send nicht zum Laufen bringen konnten, indem Sie DISPLAY auf den des Zielbenutzers setzten, können Sie diesen oder einen anderen Befehl verwenden, indem Sie aus einer Pipe lesen, an die Nachrichten gesendet werden können.

#!/bin/bash

dir=/home/you/notify-pipe/
fifo=$dir/notifications

if [ ! -e $fifo ]; then mkfifo $fifo; fi

echo $BASHPID > $dir/bash.pid

while [ -e $fifo ]; do
    read line < $fifo
    notify-send "$line"
done 

Sie können dies dann im Hintergrund mit setsid -f ./whatever.sh ausführen (oder über Ihre DE autostarten). Andere Benutzer und Systemprozesse können dann durch Schreiben an den FIFO benachrichtigen (zB. "echo Hallo > /home/Sie/notify-Rohr/Benachrichtigungen"). Wenn Ihr Zuhause nicht öffentlich lesbar ist, kann das Rohr überall sein.

Zu stoppen es müssen Sie es zu töten oder löschen Sie die Pipe. Vorsicht, dass eine Falle davon ist, dass, wenn das Rohr existiert, aber nichts davon liest (zB. das Skript), Schreiben einer Nachricht (zB. via echo) blockiert, bis etwas es liest.

 0
Author: goldilocks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2021-01-14 18:45:01