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?

marioosh
fonte

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.

mjk
fonte
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.

BRPocock
fonte
for subproc inque? Eu acho que seu script está corrompido aqui.
Stéphane