Можно ли написать сценарий оболочки, который позволяет любому пользователю (может не быть root) устанавливать сообщение (например, «Загрузка не выполняется» и т. д.), который будет передан как всплывающее сообщение (zenity или уведомлять-отправлять) всем другим пользователям. Если какой-либо пользователь не существует во время отправки сообщения, он должен получить его при входе в систему или разблокировать его экран.
Если вы не найдете прямого решения, такие проблемы можно решить, создав (простую в этом случае) программу-демон, которая запускается с повышенными привилегиями и запускается при запуске системы.
Затем обычный пользователь может поместить файл где-нибудь, когда демон увидит его или отправит демонам сообщение, и тогда демон сможет выполнить любые действия, требуемые повышенными привилегиями.
Вам просто нужно быть осторожным, daemon принимает так, что вы не открываете никаких дыр в вашей системе.
Существует почти неограниченное множество вещей, которые могут произойти, когда вы передаете неотредактированную строку символов в скрипт bash с повышенными привилегиями! По этой причине было бы намного лучше, если бы ваш демон был написан на языке, таком как Python, где вы можете делать все, что хотите, до входящей строки, прежде чем система получит какую-либо возможность интерпретировать / выполнить ее содержимое.
Для входа в систему вы, вероятно, можете добавить несколько строк в / etc / profile, которые сообщают демонам о выпуске любых сообщений, которые пользователь должен увидеть. Если вы это сделаете, вероятно, вы также должны сделать что-то, чтобы избежать ненужных повторений, когда пользователь снова войдет в систему. Это больше работает, но будет предупреждать, что вы превращаетесь в nagware.
Я думаю, что я сделал, это действительно плохой способ сделать что-то. В любом случае это работает до определенного уровня. Любые предложения по улучшению сценария или лучшего сценария всегда приветствуются. Я попытался сделать это с помощью ответов, предоставленных Rmano и Joe.
Я создал файл в /home/message.txt, у которого есть разрешение -rw-rw-rw-, так что любой пользователь (не может быть членом gropu) могут написать свое сообщение в нем. Я написал два сценария, имеющих разрешения -rwxr-xr-x
/usr/bin/msg_on_login.sh, чтобы передать сообщение пользователям при их входе /usr/bin/msgpass.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. Затем скрипт будет запускаться каждый раз при входе пользователя в систему, и он получит сообщение.
#!/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.