Передайте сообщение всем пользователям

Можно ли написать сценарий оболочки, который позволяет любому пользователю (может не быть root) устанавливать сообщение (например, «Загрузка не выполняется» и т. д.), который будет передан как всплывающее сообщение (zenity или уведомлять-отправлять) всем другим пользователям. Если какой-либо пользователь не существует во время отправки сообщения, он должен получить его при входе в систему или разблокировать его экран.

1
задан 21 November 2013 в 02:39

2 ответа

Если вы не найдете прямого решения, такие проблемы можно решить, создав (простую в этом случае) программу-демон, которая запускается с повышенными привилегиями и запускается при запуске системы.

Затем обычный пользователь может поместить файл где-нибудь, когда демон увидит его или отправит демонам сообщение, и тогда демон сможет выполнить любые действия, требуемые повышенными привилегиями.

Вам просто нужно быть осторожным, daemon принимает так, что вы не открываете никаких дыр в вашей системе.

Существует почти неограниченное множество вещей, которые могут произойти, когда вы передаете неотредактированную строку символов в скрипт bash с повышенными привилегиями! По этой причине было бы намного лучше, если бы ваш демон был написан на языке, таком как Python, где вы можете делать все, что хотите, до входящей строки, прежде чем система получит какую-либо возможность интерпретировать / выполнить ее содержимое.

Для входа в систему вы, вероятно, можете добавить несколько строк в / etc / profile, которые сообщают демонам о выпуске любых сообщений, которые пользователь должен увидеть. Если вы это сделаете, вероятно, вы также должны сделать что-то, чтобы избежать ненужных повторений, когда пользователь снова войдет в систему. Это больше работает, но будет предупреждать, что вы превращаетесь в nagware.

0
ответ дан 24 May 2018 в 15:23

Я думаю, что я сделал, это действительно плохой способ сделать что-то. В любом случае это работает до определенного уровня. Любые предложения по улучшению сценария или лучшего сценария всегда приветствуются. Я попытался сделать это с помощью ответов, предоставленных Rmano и Joe.

Я создал файл в /home/message.txt, у которого есть разрешение -rw-rw-rw-, так что любой пользователь (не может быть членом gropu) могут написать свое сообщение в нем. Я написал два сценария, имеющих разрешения -rwxr-xr-x

/usr/bin/msg_on_login.sh, чтобы передать сообщение пользователям при их входе /usr/bin/msgpass.sh, чтобы передать сообщение пользователям, которые находятся в их системе (экран может быть заблокирован)

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 $1}'` -gt 1 ] && [ $num -gt 0 ]
    then
        DISPLAY=:$num.0 zenity --info --text="`cat /home/message.txt`" &
    elif [ `wc -w /home/message.txt| gawk '{print $1}'` -gt 1 ]
        then  
            zenity --info --text="`cat /home/message.txt`" &
    else
        exit 0
fi

и добавить эту строку «/usr/bin/msg_on_login.sh» в конце /etc/profile и изменить разрешение /usr/bin/msg_on_login.sh к -rwxr-xr-x. Затем скрипт будет запускаться каждый раз при входе пользователя в систему, и он получит сообщение.

msgpass.sh

#!/bin/bash
m=`who | grep tty | awk '{print $1}' | sort | uniq | wc -l`
min=0
max=`expr $m - 1`
array=(`who | grep tty | awk '{print $1}'`)
for num in `seq $min $max`
do
if [ `wc -w /home/message.txt| gawk '{print $1}'` -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

изменить разрешение /usr/bin/msgpass.sh на -rwxr-xr-x.

Минусы

/usr/bin/msg_on_login.sh, чтобы передать сообщение пользователям при их входе в систему Скажите, что 1-й пользователь (который зарегистрировался до 2-го пользователя) вышел из системы, затем спотыкается и дает ошибку. /usr/bin/msgpass.sh, чтобы передать сообщение пользователям, которые находятся в их системе (экран может быть заблокирован) Я также нашел способ запустить скрипт как пользователь без полномочий root.

Примечание

Скажите, что 1-й пользователь (который зарегистрировался до 2-го пользователя) вышел из системы, затем msgpass.sh спотыкается и дает ошибку. [ ! d12]
0
ответ дан 24 May 2018 в 15:23
  • 1
    Для первого con: вы, вероятно, можете проверить, существует ли переменная $ DISPLAY и установлена ​​- если нет, вы не находитесь в графическом сеансе. Что-то на линии [ x$DISPLAY = x ] && exit или что-то подобное ... – Rmano 26 November 2013 в 04:21

Другие вопросы по тегам:

Похожие вопросы: