Como posso escrever um script bash que envia uma notificação gráfica para todos os monitores X dos usuários?

1

Este é um pedido de melhoria e atualização (NÃO é uma duplicação!) sobre essas duas perguntas & respostas:

Atualmente estou no Ubuntu 15.04 e o comando who fornece uma saída assim quando executado em um terminal raiz, pois meu script será usado como uma tarefa cron:


sadi     :0           2015-10-07 17:32 (:0)
root     pts/0        2015-10-07 19:55 (:0)

Depois de estudar as perguntas & respostas mencionadas acima, eu escrevi estas linhas (um pouco atualizadas, mas inacabadas):


#!/bin/bash
xuser=${who | grep -m1 ^.*\) | awk '{print $1}'}
xdisplay=${who | grep -m1 ^.*\) | awk '{print $5}' | sed 's/[(|)]//g'}
DISPLAY="$xdisplay" XAUTHORITY=/home/"$xuser"/.Xauthority su "$xuser" -c "notify-send 'Message'"

Eu me pergunto por que essas duas variáveis não funcionam (dando bad substitution ) ... Além disso, para tornar esse script aplicável a configurações diferentes (por exemplo, multiusuário), acho que devo levar em conta que pode ser outros usuários também. Então, eu acho que preciso criar um loop que insira cada usuário e seu display X no último comando, mas como iniciante no bash scripting eu não sei como ...

Até encontrar uma resposta para esta pergunta, estou usando um script de usuário único como este:


cuser="${SUDO_USER:-$USER}"
...
DISPLAY=:0 XAUTHORITY=/home/"$cuser"/.Xauthority su "$cuser" -c "notify-send 'Message'"

Parece que a grep option -m1 também deve ser modificada (assim como a substituição de ${...} por $(...) ), já que ela meramente define quantas linhas devem ser capturadas da parte superior da saída.

O comando who - executado em um terminal raiz novamente - fornece uma saída assim quando há também uma sessão de convidado, ou seja, um ambiente multiusuário:


sadi     :0           2015-10-08 10:40 (:0)
guest-bAMpqo :1           2015-10-08 12:22 (:1)
root     pts/28       2015-10-08 12:43 (:0)
guest-bAMpqo pts/18       2015-10-08 12:25 (:1)

Então, isso deve me fornecer uma lista de nomes de usuários X e X Displays:


#!/bin/bash
xusers=$(who | grep ' :[0-9]' | awk '{print $1}')
xdisplays=$(who | grep ' :[0-9]' | awk '{print $5}' | sed 's/[(|)]//g')
DISPLAY="$xdisplay" XAUTHORITY=/home/"$xuser"/.Xauthority su "$xuser" -c "notify-send 'Message'"

Agora preciso modificar o último comando para capturar essa lista linha por linha.

    
por Sadi 07.10.2015 / 19:09

1 resposta

0

Finalmente, encontrei a resposta sozinho pesquisando neste inestimável banco de dados de conhecimento do StackExchange Unix & Linux !!!

Além das respostas às perguntas acima, também usei a resposta aceita para essa pergunta: Leia dois arquivos de texto, concatene cada linha

E aqui está a resposta à minha pergunta acima:

#!/bin/bash
xuser=$(who | grep ' \:[0-9]' | awk '{print $1}')
xdisplay=$(who | grep ' \:[0-9]' | awk '{print $5}' | sed 's/[(|)]//g')
echo "$xuser" > /tmp/xusers.txt
echo "$xdisplay" > /tmp/xdisplays.txt
while read -r -u3 xuser; read -r -u4 xdisplay; do
    DISPLAY="$xdisplay" XAUTHORITY=/home/"$xuser"/.Xauthority su "$xuser" -c "notify-send 'Message multi-user'"
done 3</tmp/xusers.txt 4</tmp/xdisplays.txt
    
por 08.10.2015 / 17:33