Linux: Como enviar mensagem para o usuário local conectado ao X11?


10

É possível enviar uma mensagem (janela pop-up ou algo assim) para o usuário local conectado ao X (xdm, fluxbox) no console? Por exemplo: user1está logado e usando o X / fluxbox, user2efetuando login na mesma caixa por ssh no console. Agora - o que você user2precisa fazer para enviar uma mensagem user1?

Respostas:


15

A xmessageferramenta permite fazer exatamente isso; apresentar uma janela pop-up para os usuários com uma mensagem de texto dentro.

Exemplo: user2 efetua login em uma sessão BASH na caixa e emite:

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

se você fizer login em uma sessão TSCH, seria algo como isto:

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

Como alternativa, você pode enviar mensagens para as sessões do terminal de duas maneiras:

Usando wall(= avisar a todos [usuários])

Na página do manual:
Wall exibe o conteúdo do arquivo ou, por padrão, sua entrada padrão, nos terminais de todos os usuários atualmente conectados.

Se você deseja segmentar um usuário específico, use write. Novamente, o homem nos diz:

O utilitário de gravação permite que você se comunique com outros usuários, copiando linhas do seu terminal para o deles.


Se um destinatário ( user1no meu exemplo) estiver conectado ao X11 e não tiver aberto xtermou outro terminal - wallfuncionará também? Eu acho que user1não vai ver mensagens.
marioosh

Atualizei minha resposta para incluir a solução 'xmessage'. Isso mostrará uma pequena janela para o usuário, independentemente de ele ter um terminal aberto.
Mjk

1
Aliás, 'apropos' é um utilitário útil para se conhecer; ele procura nas páginas de manual o texto que você passa para ele. Tente executar 'apropos message' e veja o que ela retorna.
Mjk

Eu sei, xmessagemas como executá-lo user1e abrir essa pequena janela na user2tela? isso é possível?
marioosh

@ marioosh Eu também gostaria de saber como fazer isso. Você já descobriu isso?

2

Como regra, as sessões X11 geralmente são iniciadas no modo "privado", portanto, você precisa de uma de duas coisas: cooperação de user2para permitir o acesso às telas ou privilégios de superusuário para "invadir" as telas.

PERIGO: Lembre-se de que, uma vez que você tenha acesso à tela deles, também poderá fazer ações como capturar pressionamentos de tecla (incluindo potencialmente senhas) e tirar capturas de tela, portanto, esse é um grande risco à segurança.

Na maioria dos casos, é preferível usar uma ferramenta de mensagens ou um programa de bate-papo para essas coisas.

Advertências à parte:

Cooperação

Se user2quiser permitir user1acessar sua tela, primeiro é user2necessário emitir um comando como:

 xhost +si:localuser:user1

Isso poderia ser adicionado a um script de inicialização de algum tipo; Não conheço o Fluxbox, mas presumo que ele tenha um rcgancho ou um início de sessão.

Depois que isso for emitido, ele user1poderá gravar no user2visor, se eles puderem encontrá-lo.

Se user2estiver ciente disso, eles sempre poderão enviá-lo de user1alguma outra maneira.

Localizando a tela de outro usuário

Em uma estação de trabalho típica, é incomum ter mais de um ou dois usuários conectados; nesse caso, “adivinhar” que a exibição desejada é 0, 1 ou talvez 2 pode ser uma solução viável.

No entanto, para uma solução mais completa, suponha que você tenha uma máquina na qual muitos usuários possam estar conectados e tente encontrar a que deseja.

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

então, user1pode finalmente (usando o valor DISPLAY obtido acima; eu acabei de escrever :14.0aqui…)

DISPLAY=:14.0 xmessage "Hello, user2"

Enviando uma notificação

No interesse da integridade, o seguinte funciona no ambiente de trabalho Gnome, pelo menos. Não sei se o Fluxbox tem um widget de notificação.

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

Isso tem muito mais opções fáceis de usar para exibição, e provavelmente aparecerá de uma maneira mais amigável na tela do usuário.


for subproc inque? Eu acho que seu script está corrompido aqui.
Stéphane
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.