Как отправить сообщение всем пользователям в Linux
Полное руководство по отправке сообщений всем пользователям в сети Linux. Локальные и сетевые инструменты, графические диалоги с кнопками да/нет, практические примеры реализации.
Как отправить сообщение всем пользователям в сети Linux?
Какие инструменты можно использовать для отображения сообщений на экране удаленных пользователей в Linux? Идеально было бы найти решение с графическим интерфейсом, которое позволяет задать вопрос с вариантами ответа “да/нет”.
В Linux существует несколько способов отправки сообщений всем пользователям в сети, включая как консольные инструменты, так и графические решения с поддержкой диалогов “да/нет”. Для сетевого взаимодействия наиболее эффективными являются SSH-основанные методы, а для графических интерфейсов - утилиты типа zenity и yad.
Содержание
- Локальные инструменты для отправки сообщений
- Сетевые и удаленные инструменты
- Графические инструменты для диалогов
- Комбинированные решения для сети
- Практические примеры реализации
Локальные инструменты для отправки сообщений
Базовые инструменты Linux позволяют отправлять сообщения прямо на консоли локальных пользователей:
Команда wall
Команда wall (write all) предназначена для отправки сообщений всем залогиненным пользователям на локальной системе:
wall "Важное сообщение: система будет перезагружена через 10 минут"
Команда write
Для отправки сообщений конкретным пользователям:
write username "Ваше персональное сообщение"
Команда talk
Интерактивный инструмент для реального времени общения:
talk username
Примечание: Эти инструменты работают только для пользователей, залогиненных на том же физическом сервере.
Сетевые и удаленные инструменты
Для отправки сообщений по сети Linux предлагает несколько подходов:
SSH-рассылка сообщений
Один из самых надежных способов отправки сообщений на удаленные Linux-машины:
#!/bin/bash
MESSAGE="Срочное уведомление от администратора"
for HOST in server1 server2 server3; do
ssh $HOST "wall '$MESSAGE'"
done
Использование wall через сеть
Если настроен доступ без пароля, можно отправлять сообщения всем сетевым пользователям:
# Для пользователей на удаленных машинах
ssh user@remote-host "wall 'Ваше сообщение'"
Скрипт для массовой рассылки
#!/bin/bash
# send_message_to_network.sh
MESSAGE=$1
HOSTS=("server1" "server2" "server3")
for HOST in "${HOSTS[@]}"; do
echo "Отправка сообщения на $HOST..."
ssh $HOST "wall '$MESSAGE'"
done
Графические инструменты для диалогов
Для создания графических диалогов с кнопками “да/нет” в Linux существует несколько мощных инструментов:
Zenity - Графические диалоговые окна
Zenity - популярная утилита для создания диалоговых окон в shell-скриптах:
# Базовый вопрос "да/нет"
zenity --question --text "Вы уверены, что хотите продолжить?"
# Проверка ответа
if [ $? -eq 0 ]; then
echo "Пользователь выбрал Да"
else
echo "Пользователь выбрал Нет"
fi
Расширенные возможности Zenity
# Вопрос с кастомными кнопками
zenity --question --text "Установить обновления?" --ok-label "Да" --cancel-label "Нет"
# Вопрос с иконкой
zenity --question --text "Система требует перезагрузки" --icon-name="warning"
Yad - Yet Another Dialog
Более мощная альтернатива Zenity с расширенными возможностями:
# Базовый диалог "да/нет"
yad --question --title="Подтверждение" --text="Вы хотите удалить этот файл?"
# С прогресс-баром
yad --question --text="Обработка файлов..." --progress-text="Идет обработка"
Dialog - Классическая утилита
# Диалог "да/нет" в консоли
dialog --yesno "Продолжить установку?" 8 40
# Обработка ответа
case $? in
0) echo "Да";;
1) echo "Нет";;
255) echo "Отмена";;
esac
Комбинированные решения для сети
Полный скрипт для сетевых сообщений с GUI
#!/bin/bash
# network_message_gui.sh
# Проверка, передано ли сообщение
if [ $# -eq 0 ]; then
MESSAGE=$(zenity --entry --title="Сообщение для сети" --text="Введите сообщение для отправки:")
else
MESSAGE="$1"
fi
# Подтверждение отправки
if zenity --question --text="Отправить сообщение '$MESSAGE' всем серверам?"; then
HOSTS=("server1.example.com" "server2.example.com" "server3.example.com")
for HOST in "${HOSTS[@]}"; do
if ssh $HOST "wall '$MESSAGE'"; then
zenity --info --text="Сообщение успешно отправлено на $HOST"
else
zenity --error --text="Ошибка при отправке на $HOST"
fi
done
zenity --info --text="Рассылка завершена"
else
zenity --info --text="Отправка отменена"
fi
Скрипт для межплатформенной рассылки
#!/bin/bash
# cross_platform_message.sh
MESSAGE=$1
# Linux-сервера
for HOST in linux-server-1 linux-server-2; do
ssh $HOST "wall '$MESSAGE'" &
done
# Windows-клиенты (если установлен smbclient)
if [ -x "$(command -v smbclient)" ]; then
echo "$MESSAGE" | smbclient -M workstation-1 -U guest &
echo "$MESSAGE" | smbclient -M workstation-2 -U guest &
fi
zenity --info --text="Сообщение отправлено в сеть"
Практические примеры реализации
Пример 1: Система уведомлений о перезагрузке
#!/bin/bash
# reboot_notification.sh
MESSAGE="Система будет перезагружена через 5 минут. Сохраните все работы!"
# Локальные пользователи
wall "$MESSAGE"
# Удаленные серверы
SERVERS=("web-server" "db-server" "app-server")
for SERVER in "${SERVERS[@]}"; do
ssh $SERVER "wall '$MESSAGE'" &
done
# Графическое подтверждение
zenity --info --text="Уведомления о перезагрузке отправлены"
Пример 2: Интерактивный опрос пользователей
#!/bin/bash
# user_poll.sh
QUESTION="Нужно ли установить обновления безопасности?"
# Локальный опрос
if zenity --question --text="$QUESTION"; then
LOCAL_ANSWER="Да"
else
LOCAL_ANSWER="Нет"
fi
echo "Локальный пользователь ответил: $LOCAL_ANSWER"
# Сетевой опрос
ANSWERS_FILE="/tmp/user_answers.txt"
echo "Локальный: $LOCAL_ANSWER" > "$ANSWERS_FILE"
for HOST in server1 server2 server3; do
ssh $HOST "
if zenity --question --text='$QUESTION'; then
echo '$HOST: Да' >> /tmp/answer
else
echo '$HOST: Нет' >> /tmp/answer
fi
" &
done
wait
# Собираем все ответы
for HOST in server1 server2 server3; do
scp $HOST:/tmp/answer >> "$ANSWERS_FILE"
done
# Показываем результаты
zenity --text-info --filename="$ANSWERS_FILE" --title="Результаты опроса"
Пример 3: Мониторинг состояния сети с уведомлениями
#!/bin/bash
# network_monitor.sh
while true; do
# Проверка доступности серверов
for HOST in server1 server2 server3; do
if ! ping -c 1 $HOST > /dev/null 2>&1; then
MESSAGE="ВНИМАНИЕ: Сервер $HOST недоступен!"
# Локальное уведомление
wall "$MESSAGE"
# Отправка на другие серверы
for OTHER in server1 server2 server3; do
if [ "$OTHER" != "$HOST" ]; then
ssh $OTHER "wall '$MESSAGE'" &
fi
done
# Графическое предупреждение
zenity --warning --text="Обнаружена проблема с сервером $HOST"
fi
done
sleep 300 # Проверка каждые 5 минут
done
Источники
- How to Send a Message to Logged Users in Linux Terminal
- Communicating with other users on the Linux command line
- Zenity: A Graphical Dialog Box Utility for Linux
- yad Command Linux: Complete Guide to Yet Another Dialog Tool
- How to send messages or chat in Linux
- Send a ‘net send like’ message from a Linux Host to ALL Linux and Windows computers
- dialog(1): dialog boxes from shell scripts
- Sending messages to another user
Заключение
- Для локальных систем используйте
wall,writeиtalkкомандные утилиты - Для сетевой рассылки применяйте SSH-скрипты с параллельной отправкой сообщений
- Графические диалоги “да/нет” реализуются через
zenity,yadилиdialog - Комбинированные решения позволяют создавать интерактивные сетевые системы уведомлений
- Наиболее эффективный подход - сочетание SSH для удаленных машин и GUI-инструментов для локального взаимодействия
Для решения вашей задачи с графическим интерфейсом и кнопками “да/нет” рекомендую использовать zenity в связке с SSH-рассылкой, что обеспечит как сетевое распространение сообщений, так и удобный пользовательский интерфейс для подтверждения действий.