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

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

5
задан 21 November 2013 в 00:39

3 ответа

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

Я иду в VC и захожу как ubuntu ---, затем я запускаю

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

(первый sudo переключается на superuser, второй sudo execute zenity от имени пользователя romano)

с виртуальной консоли сообщение появится в графическом окружении «романо».

Я полагаю, что при небольшом искажении вывода w, чтобы получить DISPLAY и пользователей и их циклическое переключение, можно было бы получить рабочее решение. Неграфически подключенные пользователи могут быть проинформированы с помощью wall.

Я вижу, действительно трудно сделать это без привилегий суперпользователя, жестко.

0
ответ дан 21 November 2013 в 00:39

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

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

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

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

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

0
ответ дан 21 November 2013 в 00:39
1127 Я думаю, что то, что я сделал, действительно плохой способ делать вещи. В любом случае, это работает до определенного уровня. Любые предложения по улучшению сценария или улучшению сценария всегда приветствуются. Я попытался сделать это с помощью ответов, данных Рмано и Джо.

Я создал файл в /home/message.txt, у которого есть разрешение -rw-rw-rw-, так что любой пользователь (не может быть членом sudo 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.

Минусы

  • Если любой пользователь войдет в систему с виртуального терминала, он получит сообщение об ошибке. Разобраться с такой ситуацией сложно. Поскольку такая ситуация не была предназначена, поэтому я пропустил эту часть.
  • Скажем, 1-й пользователь (который вошел до 2-го пользователя) выходит из системы, затем msgpass.sh останавливается и выдает ошибку.
  • Для запуска msgpass.sh вам нужен член группы sudo.
  • Я также нахожу способ запуска скрипта от имени пользователя без полномочий root .

Примечание

  • Нужна помощь в устранении первых двух минусов.
0
ответ дан 21 November 2013 в 00:39

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

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