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

10

Ist es möglich, eine Nachricht (Popup-Fenster oder ähnliches) an einen lokalen Benutzer zu senden, der über die Konsole bei X (xdm, Fluxbox) angemeldet ist? Beispiel: user1Wird protokolliert und verwendet X / Fluxbox, user2um sich von ssh an der Konsole in derselben Box anzumelden. Was muss user2ich tun, um eine Nachricht an zu senden user1?

Marioosh
quelle

Antworten:

15

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

Beispiel: Benutzer2 meldet sich bei einer BASH-Sitzung auf der Box an und gibt folgende Probleme aus:

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

Wenn Sie sich bei einer TSCH-Sitzung anmelden, sieht dies ungefähr so ​​aus:

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

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

Verwenden von wall(= alle [Benutzer] warnen)

Über die Manpage:
Wall zeigt den Inhalt der Datei oder standardmäßig deren Standardeingabe auf den Terminals aller derzeit angemeldeten Benutzer an.

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

Mit dem Schreibdienstprogramm können Sie mit anderen Benutzern kommunizieren, indem Sie Leitungen von Ihrem Terminal auf ihre kopieren.

mjk
quelle
Wenn ein Empfänger ( user1in meinem Beispiel) bei X11 angemeldet ist und noch kein xtermanderes Terminal geöffnet hat , wallfunktioniert das auch? Ich denke, das user1wird keine Nachrichten sehen.
Marioosh
Ich habe meine Antwort aktualisiert und die 'xmessage'-Lösung hinzugefügt. Dadurch wird dem Benutzer ein kleines Fenster angezeigt, unabhängig davon, ob ein Terminal geöffnet ist.
MJK
1
Übrigens ist 'apropos' ein nützliches Dienstprogramm, um es zu wissen. Es durchsucht Handbuchseiten nach dem Text, den Sie an ihn übergeben. Versuchen Sie, 'apropos message' auszuführen, und sehen Sie, was zurückgegeben wird.
MJK
Ich weiß, xmessageaber wie man es durchläuft user1und dieses kleine Fenster auf user2dem Bildschirm öffnet ? ist es überhaupt möglich ?
Marioosh
@marioosh Ich würde auch gerne wissen, wie das geht. Hast du es jemals herausgefunden?
2

In der Regel werden X11-Sitzungen in einem "privaten" Modus gestartet. Sie benötigen daher eines von zwei Dingen: entweder die Zusammenarbeit von user2, um auf ihre Bildschirme zugreifen zu können, oder die 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 Kennwörter) erfassen und Screenshots erstellen. Dies ist also ein großes Sicherheitsrisiko.

In den meisten Fällen ist es vorzuziehen, stattdessen ein Messaging-Tool oder ein Chat-Programm für diese Dinge zu verwenden.

Vorbehalte beiseite:

Zusammenarbeiten

Wenn Sie user2den user1Zugriff auf den Bildschirm zulassen möchten, user2müssen Sie zunächst einen Befehl wie den folgenden eingeben:

 xhost +si:localuser:user1

Dies könnte möglicherweise zu einem Startskript hinzugefügt werden. Ich kenne Fluxbox nicht, aber ich gehe davon aus, dass es einen rcoder Session-Start-Hook hat.

Sobald dies ausgegeben wurde, user1kann auf user2das Display geschrieben werden, wenn sie es finden können.

Wenn Sie user2sich dessen bewusst sind, können Sie es jederzeit auf user1andere Weise senden .

Anzeige eines anderen Benutzers suchen

Auf einer typischen Workstation ist es ungewöhnlich, dass mehr als ein oder zwei Benutzer angemeldet sind. In diesem Fall ist es möglicherweise eine praktikable Lösung, zu erraten, dass die gewünschte Anzeige 0, 1 oder vielleicht 2 ist.

Für eine vollständigere Lösung nehmen wir jedoch an, dass Sie einen Computer haben, auf dem sehr viele Benutzer angemeldet sein könnten, und versuchen, den gewünschten zu finden.

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 user1kann endlich (mit dem oben erhaltenen DISPLAY-Wert; ich habe gerade :14.0hier geschrieben ...)

DISPLAY=:14.0 xmessage "Hello, user2"

Senden Sie stattdessen eine Benachrichtigung

Der Vollständigkeit halber funktioniert das Folgende zumindest auf dem Gnome-Desktop. Ich weiß nicht, ob Fluxbox ein Benachrichtigungs-Widget hat.

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

Dies bietet viel benutzerfreundlichere Anzeigeoptionen und wird wahrscheinlich auf dem Bildschirm des Benutzers auf eine freundlichere Weise angezeigt.

BRPocock
quelle
for subproc inWas? Ich denke, Ihr Skript ist hier beschädigt.
Stéphane