Transmitir alguma mensagem para todos os usuários

5

É possível escrever um script de shell que permita a qualquer usuário (não pode ser root) definir uma mensagem (por exemplo, "Download no progresso não desligue" etc.) que será transmitida como mensagem pop-up (zenity). ou notificar-enviar) para todos os outros usuários. Se algum usuário não estiver lá no momento de lançar a mensagem, deverá obtê-lo no login ou desbloquear sua tela.

    
por souravc 11.11.2013 / 18:39

3 respostas

1

Boa pergunta. Vai dar apenas uma meia resposta ... apenas uma semente para ver se alguém pode preparar algo a partir disso. Eu testei isso no meu sistema, dois usuários (ubuntu e romano, os dois administradores).

Eu vou para um VC e faço login como o ubuntu --- então eu corro

sudo sudo -u romano DISPLAY=:0.0 zenity --warning

(o primeiro sudo muda para superusuário, o segundo sudo executa zenity como o usuário romano )

de um console virtual, a mensagem aparecerá no ambiente gráfico "romano".

Suponho que, com um pouco de erro na saída de w para obter o DISPLAY e os usuários e fazer o loop sobre eles, seria possível ter uma solução funcional. Usuários conectados não-gráficos podem ser informados usando wall .

Eu vejo muito difícil fazer isso sem privilégios de superusuário, difícil.

    
por Rmano 12.11.2013 / 22:42
0

Se você não encontrar uma solução direta, problemas como esse podem ser resolvidos criando um programa daemon (simples, neste caso) que é executado com privilégios elevados e é executado quando o sistema é iniciado.

Em seguida, um usuário normal pode colocar um arquivo em algum lugar onde o daemon o verá ou enviar uma mensagem ao daemon, e o daemon poderá então executar qualquer ação que requeira privilégios elevados.

Você só precisa tomar cuidado com a entrada que o daemon aceita para não abrir brechas de segurança em seu sistema.

Há uma variedade quase ilimitada de coisas que podem acontecer quando você passa uma sequência de caracteres não editada para um script bash que é executado com privilégios elevados! Só por essa razão, seria muito melhor se o seu daemon fosse escrito em uma linguagem como Python, onde você pode fazer o que quiser em uma string de entrada antes que o sistema tenha alguma chance de interpretar / executar seu conteúdo.

Para usuários que fazem login, você provavelmente pode adicionar algumas linhas ao / etc / profile, que dizem ao daemon para emitir qualquer mensagem que o usuário precise ver. Se você fizer isso, provavelmente também deve fazer algo para evitar repetições desnecessárias quando o usuário fizer login novamente. Isso é mais trabalho, mas evitará que os alertas se transformem em nagware.

    
por Joe 14.11.2013 / 04:02
0

Eu acho que o que eu fiz é realmente uma maneira ruim de fazer as coisas. De qualquer forma, funciona até um certo nível. Qualquer sugestão para melhorar o roteiro ou um roteiro melhor é sempre bem vinda. Eu tentei fazer isso com a ajuda das respostas dadas por Rmano e Joe.

Eu criei um arquivo em /home/message.txt , que tem permissão -rw-rw-rw- , para que qualquer usuário (que não seja membro do sudo gropu) possa escrever sua mensagem nele. Eu escrevi dois scripts com permissões -rwxr-xr-x

  • /usr/bin/msg_on_login.sh para passar a mensagem para os usuários em seu login
  • /usr/bin/msgpass.sh para passar a mensagem para os usuários que estão em seu sistema (a tela pode estar bloqueada)

msg_on_login.sh

#!/bin/bash

m='who | grep tty | wc -l'
# how many users are logged in
num='expr $m - 1'
# it helps to send the message to exact display in case one or more user is already logged in
if [ 'wc -w /home/message.txt| gawk '{print }'' -gt 1 ] && [ $num -gt 0 ]
    then
        DISPLAY=:$num.0 zenity --info --text="'cat /home/message.txt'" &
    elif [ 'wc -w /home/message.txt| gawk '{print }'' -gt 1 ]
        then  
            zenity --info --text="'cat /home/message.txt'" &
    else
        exit 0
fi

e adicione esta linha " /usr/bin/msg_on_login.sh " no final de /etc/profile e altere a permissão de /usr/bin/msg_on_login.sh para -rwxr-xr-x . Então o script será executado toda vez que qualquer usuário entrar e ele receberá a mensagem.

msgpass.sh

#!/bin/bash
m='who | grep tty | awk '{print }' | sort | uniq | wc -l'
min=0
max='expr $m - 1'
array=('who | grep tty | awk '{print }'')
for num in 'seq $min $max'
do
if [ 'wc -w /home/message.txt| gawk '{print }'' -gt 1 ] 
then
    sudo sudo -u ${array[num]} DISPLAY=:$num.0 zenity --info --text="'cat /home/message.txt'" &
else
    exit 0
fi
done
echo 0 > /home/message.txt

altere a permissão de /usr/bin/msgpass.sh para -rwxr-xr-x .

Contras

  • Se algum login de usuário de um terminal virtual, ele receberá uma mensagem de erro. Para lidar com essa situação é complicado. Como tal situação não foi planejada, eu pulei essa parte.
  • Digamos que o primeiro usuário (que fez login antes do segundo usuário) faça logout no sistema e, em seguida, msgpass.sh se depara e dá erro.
  • Para executar msgpass.sh , você precisa ter um membro do grupo sudo.
  • Estou também a encontrar uma forma de executar o script como não raiz usuário .

Nota

  • Preciso de ajuda para remover os dois primeiros contras.
por souravc 21.11.2013 / 05:06

Tags