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 ?
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.
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.
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.
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.
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