Linux: ¿Cómo enviar un mensaje al usuario local conectado a X11?


10

¿Es posible enviar un mensaje (ventana emergente o algo así) al usuario local conectado a X (xdm, fluxbox) desde la consola? Por ejemplo: user1se registra y usa X / fluxbox, iniciando user2sesión en el mismo cuadro mediante ssh para la consola. Ahora, ¿qué user2tiene que hacer para enviar un mensaje user1?

Respuestas:


15

La xmessageherramienta te permite hacer exactamente eso; presentar una ventana emergente a los usuarios con un mensaje de texto dentro.

Ejemplo: user2 inicia sesión en una sesión BASH en el cuadro y emite:

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

si inicia sesión en una sesión TSCH, sería algo como esto:

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

Alternativamente, puede enviar mensajes a sesiones de terminal de una de dos maneras:

Usando wall(= advertir a todos [usuarios])

Desde la página de manual:
Wall muestra el contenido del archivo o, por defecto, su entrada estándar, en los terminales de todos los usuarios actualmente conectados.

Si desea apuntar a un usuario específico, use write. De nuevo, el hombre nos dice:

La utilidad de escritura le permite comunicarse con otros usuarios, copiando líneas de su terminal a las de ellos.


Si un destinatario ( user1en mi ejemplo) ha iniciado sesión en X11 y no ha abierto xtermu otro terminal, ¿ wallfuncionará también? Creo que user1eso no verá mensajes.
marioosh

Actualicé mi respuesta para incluir la solución 'xmessage'. Eso mostrará una pequeña ventana al usuario, independientemente de si tiene un terminal abierto.
mjk

1
Por cierto, 'a propósito' es una utilidad útil para saber; busca en las páginas del manual el texto que le pasa. Intente ejecutar 'mensaje a propósito' y vea qué devuelve.
mjk

No sé xmessagecómo ejecutarlo user1y abrir esta pequeña ventana en user2la pantalla. ¿Es posible?
marioosh

@marioosh También me gustaría saber cómo hacerlo. ¿Alguna vez lo resolviste?

2

Como regla general, las sesiones X11 generalmente se inician en un modo "privado", por lo que necesita una de dos cosas: cooperación, user2para permitirle acceder a sus pantallas, o privilegios de superusuario para "entrar" en sus pantallas.

PELIGRO: Tenga en cuenta que, una vez que tenga acceso a su pantalla, también puede hacer cosas como capturar pulsaciones de teclas (que pueden incluir contraseñas) y tomar capturas de pantalla, por lo que este es un gran riesgo de seguridad.

En la mayoría de los casos, es preferible utilizar una herramienta de mensajería o un programa de chat para estas cosas.

Advertencias a un lado:

Cooperando

Si user2quiere permitir el user1acceso a su pantalla, primero user2debe emitir un comando como:

 xhost +si:localuser:user1

Esto podría agregarse potencialmente a un script de inicio de algún tipo; No conozco Fluxbox, pero supongo que tiene un rcenlace de inicio de sesión.

Una vez que esto se ha emitido, user1puede escribir en user2la pantalla, si pueden encontrarlo.

Si user2es consciente de esto, siempre pueden enviarlo de user1alguna otra manera.

Encontrar la pantalla de otro usuario

En una estación de trabajo típica, es inusual tener más de uno o dos usuarios conectados; en cuyo caso, "adivinar" que la pantalla que desea es 0, 1 o quizás 2 podría ser una solución viable.

Sin embargo, para una solución más completa, supongamos que tiene una máquina en la que pueden iniciar sesión muchos usuarios e intente encontrar la que desea.

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

entonces, user1finalmente puede (usando el valor DISPLAY obtenido anteriormente; acabo de escribir :14.0aquí ...)

DISPLAY=:14.0 xmessage "Hello, user2"

En vez de enviar una notificación

En aras de la integridad, lo siguiente funciona en el escritorio de Gnome, al menos. No sé si Fluxbox tiene un widget de notificación.

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

Esto tiene muchas más opciones de visualización fáciles de usar, y probablemente aparecerá de una manera más amigable en la pantalla del usuario.


for subproc in¿Qué? Creo que tu guión está dañado aquí.
Stéphane
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.