Linux: Comment envoyer un message à un utilisateur local connecté à X11?

10

Est-il possible d'envoyer un message (fenêtre popup ou quelque chose) à un utilisateur local connecté à X (xdm, fluxbox) à partir de la console? Par exemple: user1est connecté et utilise X / fluxbox, se user2connectant à la même boîte par ssh pour la console. Maintenant - que user2faire pour envoyer un message user1?

marioosh
la source

Réponses:

15

L' xmessageoutil vous permet de faire exactement cela; présenter une fenêtre contextuelle aux utilisateurs avec un message texte à l'intérieur.

Exemple: l'utilisateur2 se connecte à une session BASH sur la boîte et émet:

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

si vous vous connectez à une session TSCH, ce serait quelque chose comme ceci:

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

Vous pouvez également envoyer des messages aux sessions de terminal de l'une des deux manières suivantes:

Utilisation wall(= avertir tous les [utilisateurs])

Depuis la page de manuel:
Wall affiche le contenu du fichier ou, par défaut, son entrée standard, sur les terminaux de tous les utilisateurs actuellement connectés.

Si vous souhaitez cibler un utilisateur spécifique, utilisez write. Encore une fois, l'homme nous dit:

L'utilitaire d'écriture vous permet de communiquer avec d'autres utilisateurs, en copiant les lignes de votre terminal vers le leur.

mjk
la source
Si un destinataire ( user1dans mon exemple) est connecté à X11, et n'a pas ouvert xtermou autre terminal - wallfonctionnera aussi? Je pense que user1cela ne verra pas les messages.
marioosh
J'ai mis à jour ma réponse pour inclure la solution «xmessage». Cela affichera une petite fenêtre à l'utilisateur, qu'il ait ou non un terminal ouvert.
mjk
1
Soit dit en passant, «apropos» est un utilitaire utile à connaître; il recherche dans les pages de manuel le texte que vous lui passez. Essayez d'exécuter «un message à propos» et voyez ce qu'il renvoie.
mjk
Je sais xmessagemais comment l'exécuter user1et obtenir cette petite fenêtre ouverte sur user2l'écran de? est-ce même possible?
marioosh
@marioosh J'aimerais aussi savoir comment faire. L'avez-vous déjà compris?
2

En règle générale, les sessions X11 sont généralement démarrées en mode «privé», vous avez donc besoin de deux choses: soit la coopération de user2pour vous permettre d'accéder à leurs écrans, soit les privilèges de superutilisateur pour «pénétrer» sur leurs écrans.

DANGER: Gardez à l'esprit qu'une fois que vous avez accès à leur écran, vous pouvez également faire des choses comme capturer des touches (y compris éventuellement des mots de passe) et prendre des captures d'écran, c'est donc un gros risque pour la sécurité.

Dans la plupart des cas, il est préférable d'utiliser à la place un outil de messagerie ou un programme de chat pour ces choses.

Mises en garde de côté:

Coopérer

Si vous user2souhaitez autoriser l' user1accès à leur écran, vous user2devez d' abord lancer une commande comme:

 xhost +si:localuser:user1

Cela pourrait potentiellement être ajouté à un script de démarrage d'une sorte; Je ne connais pas Fluxbox, mais je suppose qu'il a un rchook de démarrage de session.

Une fois celui-ci émis, il user1peut alors écrire sur user2l'affichage, s'il peut le trouver.

S'ils en user2sont conscients, ils peuvent toujours l'envoyer d' user1une autre manière.

Recherche de l'affichage d'un autre utilisateur

Sur un poste de travail typique, il est inhabituel d'avoir plus d'un ou deux utilisateurs connectés; dans ce cas, «deviner» que l'affichage souhaité est 0, 1 ou peut-être 2 pourrait être une solution viable.

Cependant, pour une solution plus complète, supposons que vous disposez d'une machine sur laquelle de nombreux utilisateurs peuvent être connectés, et essayez de trouver celle que vous souhaitez.

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

puis, user1enfin (en utilisant la valeur DISPLAY obtenue ci-dessus; je viens d'écrire :14.0ici…)

DISPLAY=:14.0 xmessage "Hello, user2"

Envoi d'une notification à la place

Dans un souci d'exhaustivité, les éléments suivants fonctionnent au moins sur le bureau Gnome. Je ne sais pas si Fluxbox a un widget de notification.

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

Cela a des options d'affichage beaucoup plus conviviales et apparaîtra probablement de manière plutôt conviviale sur l'écran de l'utilisateur.

BRPocock
la source
for subproc inquelle? Je pense que votre script est corrompu ici.
Stéphane